如何在iOS7中绘制透明的UIToolbar或UINavigationBar
我想要一个完全透明的UIToolbar
和/或UINavigationBar
。 我已经尝试过为iOS 5之前和之后提供的各种咒语,但没有一个似乎能够继续工作。
这怎么可能在iOS 7中完成?
Swift 3(iOS 10)
透明的UIToolbar
self.toolbar.setBackgroundImage(UIImage(), forToolbarPosition: .any, barMetrics: .default) self.toolbar.setShadowImage(UIImage(), forToolbarPosition: .any)
透明的UINavigationBar
self.navigationBar.setBackgroundImage(UIImage(), for: .default) self.navigationBar.shadowImage = UIImage() self.navigationBar.isTranslucent = true
斯威夫特<3
透明的UIToolbar
self.toolbar.setBackgroundImage(UIImage(), forToolbarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default) self.toolbar.setShadowImage(UIImage(), forToolbarPosition: UIBarPosition.Any)
透明的UINavigationBar
self.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationBar.shadowImage = UIImage() self.navigationBar.translucent = true
Objective-C的
透明的UIToolbar
[self.toolbar setBackgroundImage:[UIImage new] forToolbarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault]; [self.toolbar setShadowImage:[UIImage new] forToolbarPosition:UIBarPositionAny];
透明的UINavigationBar
[self.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault]; self.navigationBar.shadowImage = [UIImage new]; self.navigationBar.translucent = YES;
讨论
由于UINavigationBar
文档中讨论的行为,在导航栏上将translucent
设置为YES
实现这一function。 我会在这里报告相关的片段:
如果在具有不透明的自定义背景图像的导航栏上将此属性设置为
YES
,则导航栏会将小于1.0的系统不透明度应用于图像。
最后结果
如果你想通过整个应用程序,你应该使用UIAppearance代理(iOS5 +):
UINavigationBar *navigationBarAppearance = [UINavigationBar appearance]; navigationBarAppearance.backgroundColor = [UIColor clearColor]; [navigationBarAppearance setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault]; navigationBarAppearance.shadowImage = [[UIImage alloc] init];
文档: https : //developer.apple.com/library/ios/documentation/UIKit/Reference/UIAppearance_Protocol/Reference/Reference.html
文章: http : //nshipster.com/uiappearance/
尝试:
[navBar setBackgroundImage:[UIImage alloc] forBarMetrics:UIBarMetricsDefault];
@implementation MyCustomNavigationBar - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self setup]; } return self; } - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { [self setup]; } return self; } - (void)setup { [self setupBackground]; } - (void)setupBackground { self.backgroundColor = [UIColor clearColor]; self.tintColor = [UIColor clearColor]; // make navigation bar overlap the content self.translucent = YES; self.opaque = NO; // remove the default background image by replacing it with a clear image [self setBackgroundImage:[self.class maskedImage] forBarMetrics:UIBarMetricsDefault]; // remove defualt bottom shadow [self setShadowImage: [UIImage new]]; } + (UIImage *)maskedImage { const float colorMask[6] = {222, 255, 222, 255, 222, 255}; UIImage *img = [UIImage imageNamed:@"nav-white-pixel-bg.jpg"]; return [UIImage imageWithCGImage: CGImageCreateWithMaskingColors(img.CGImage, colorMask)]; } @end
我偶然发现的是,如果我创build了一个子类UINavigationBar
,然后创build了一个空的-(void)drawRect:
方法,我会得到一个透明的导航栏。 我只在iOS 7中testing过这个,但它似乎起作用了!