Answers:
如果有人想知道如何在iOS 7+中实现此目标,请使用以下解决方案(也兼容iOS 6)
在Objective-C中
[self.navigationBar setBackgroundImage:[UIImage new]
forBarMetrics:UIBarMetricsDefault];
self.navigationBar.shadowImage = [UIImage new];
self.navigationBar.translucent = YES;
在Swift 3(iOS 10)中
self.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.isTranslucent = true
迅速2
self.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.translucent = true
由于文档中讨论的行为,在导航栏上设置translucent
为可以YES
解决问题UINavigationBar
。我将在这里报告相关片段:
如果将此属性设置为
YES
带有不透明自定义背景图像的导航栏,则导航栏将对图像应用小于1.0的系统不透明度。
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true
在iOS5中,您可以执行以下操作以使导航栏透明:
nav.navigationBar.translucent = YES; // Setting this slides the view up, underneath the nav bar (otherwise it'll appear black)
const float colorMask[6] = {222, 255, 222, 255, 222, 255};
UIImage *img = [[UIImage alloc] init];
UIImage *maskedImage = [UIImage imageWithCGImage: CGImageCreateWithMaskingColors(img.CGImage, colorMask)];
[nav.navigationBar setBackgroundImage:maskedImage forBarMetrics:UIBarMetricsDefault];
[img release];
[[UINavigationBar appearance] setShadowImage: [[UIImage alloc] init]];
从IOS7:
self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.shadowImage = [UIImage new];
self.navigationController.view.backgroundColor = [UIColor clearColor];
[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
对于任何想在Swift 2.x中执行此操作的人:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.translucent = true
或Swift 3.x:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
这似乎可行:
@implementation UINavigationBar (custom)
- (void)drawRect:(CGRect)rect {}
@end
navigationController.navigationBar.backgroundColor = [UIColor clearColor];
-drawRect:
在适当的子类中(而不是在类别中)覆盖,然后将此子类用作导航栏。
完成上述其他人说的之后,即:
navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.isTranslucent = true
... 我的导航栏仍然是白色的。所以我添加了这一行:
navigationController?.navigationBar.backgroundColor = .clear
等等!这似乎可以解决问题。
如果您使用最新的Beta iOS 13.4和XCode 11.4进行构建,那么可接受的答案将不再起作用。我发现了另一种方式,也许只是beta版软件中的一个错误,但我还是在这里写下来,以防万一
(速5)
import UIKit
class TransparentNavBar :UINavigationBar {
override func awakeFromNib() {
super.awakeFromNib()
self.setBackgroundImage(UIImage(), for: .default)
self.shadowImage = UIImage()
self.isTranslucent = true
self.backgroundColor = .clear
if #available(iOS 13.0, *) {
self.standardAppearance.backgroundColor = .clear
self.standardAppearance.backgroundEffect = .none
self.standardAppearance.shadowColor = .clear
}
}
}
我知道这个主题很旧,但是如果人们想知道它是如何完成而不重载drawRect方法的。
这是您需要的:
self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.opaque = YES;
self.navigationController.navigationBar.tintColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
以下代码扩展了为此线程选择的顶部答案,以摆脱底部边框并设置文本颜色:
该代码的最后两行编码设置了透明度。我从该线程中借用了该代码,并且效果很好!
“ clipsToBounds”属性是我发现的代码,该代码摆脱了带有OR且未设置透明度的底部边框线(因此,如果您决定使用纯白色/黑色/等背景,则仍然没有边框线)。
“ tintColor”行(第二行编码)将我的后退按钮设置为浅灰色
我保留了barTintColor作为备份。我不知道为什么透明度不起作用,但是如果不起作用,我希望我的bg白色,就像以前那样
let navigationBarAppearace = UINavigationBar.appearance()
navigationBarAppearace.tintColor = UIColor.lightGray
navigationBarAppearace.barTintColor = UIColor.white
navigationBarAppearace.clipsToBounds = true
navigationBarAppearace.isTranslucent = true
navigationBarAppearace.setBackgroundImage(UIImage(), for: .default)
navigationBarAppearace.shadowImage = UIImage()
对我有用的另一种方法是将UINavigationBar子类化,并将drawRect方法留空!
@IBDesignable class MONavigationBar: UINavigationBar {
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
// Drawing code
}}
在Swift 4.2中
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
(在viewWillAppear中),然后在viewWillDisappear中将其撤消,
self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.isTranslucent = false
检查RRViewControllerExtension,它专用于UINavigation栏外观管理。
在项目中使用RRViewControllerExtension时,您只需要覆盖
-(BOOL)prefersNavigationBarTransparent;
在您的ViewController中。
extension UINavigationBar {
var isTransperent: Bool {
get {
return false // Just to satisfy property
}
set {
if newValue == true {
self.shadowImage = UIImage()
self.isTranslucent = true
self.setBackgroundImage(UIImage(), for: .default)
}else{
self.shadowImage = UIImage()
self.isTranslucent = false
self.setBackgroundImage(nil, for: .default)
}
}
}
}
[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = nil; self.navigationController.navigationBar.translucent = NO;