如何在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过这个,但它似乎起作用了!