透明的UINavigationBar在Swift中

我正在尝试使UINavigationBar中的UINavigationController透明。 我创build了UINavigationController一个子类,并且喜欢它到我的故事板文件中的一个场景。 这是我的一个子类:

 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. let size = self.navigationBar.frame.size self.navigationBar.setBackgroundImage(imageWithColor(UIColor.blackColor(), size: size, alpha: 0.2), forBarMetrics: UIBarMetrics.Default) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func imageWithColor(color: UIColor, size: CGSize, alpha: CGFloat) -> UIImage { UIGraphicsBeginImageContext(size) let currentContext = UIGraphicsGetCurrentContext() let fillRect = CGRectMake(0, 0, size.width, size.height) CGContextSetFillColorWithColor(currentContext, color.CGColor) CGContextSetAlpha(currentContext, alpha) CGContextFillRect(currentContext, fillRect) let retval: UIImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return retval } 

当我运行我的应用程序时,导航栏是透明的,但状态栏只是黑色。

例如,如果我在UITabBar上做这样的事情 – 它的作品。

希望它能帮助你

Swift 2:

 self.navigationController.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationController.navigationBar.shadowImage = UIImage() self.navigationController.navigationBar.translucent = true self.navigationController.view.backgroundColor = UIColor.clearColor() 

斯威夫特4

 self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.isTranslucent = true self.navigationController?.view.backgroundColor = UIColor.clear 

或者如果您想要浏览导航控制器,请参阅此答案 。


通过以下方式更改状态栏样式:

在您的Info.plist中,您需要将基于视图控制器的状态栏外观定义为任何值。

在这里输入图像说明

 UIApplication.shared.statusBarStyle = .lightContent 

如果你想隐藏状态栏:

 UIApplication.shared.isStatusBarHidden = true 

通过轻量级内容和透明导航获取此输出。 我认为背景是灰色的。 你可以看到透明度。

在这里输入图像说明

如果你使用Swift 2.0,使用下面的代码块:

  self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true 

对于Swift 3.0使用:

 navigationController?.setNavigationBarHidden(false, animated: true) navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default) navigationController?.navigationBar.shadowImage = UIImage() navigationController?.navigationBar.isTranslucent = true 

Swift 3.0.1与Xcode 8.1

在你的UINavigationController

 override func viewDidLoad() { super.viewDidLoad() self.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default) self.navigationBar.shadowImage = UIImage() self.navigationBar.isTranslucent = true self.view.backgroundColor = UIColor.clear } 

Xcode 8.x:Swift 3:扩展为相同的写一遍使用

 extension UINavigationBar { func transparentNavigationBar() { self.setBackgroundImage(UIImage(), for: .default) self.shadowImage = UIImage() self.isTranslucent = true } } 

创buildUINavigationController的扩展,并显示或隐藏透明导航栏。

 extension UINavigationController { public func presentTransparentNavigationBar() { navigationBar.setBackgroundImage(UIImage(), for:UIBarMetrics.default) navigationBar.isTranslucent = true navigationBar.shadowImage = UIImage() setNavigationBarHidden(false, animated:true) } public func hideTransparentNavigationBar() { setNavigationBarHidden(true, animated:false) navigationBar.setBackgroundImage(UINavigationBar.appearance().backgroundImage(for: UIBarMetrics.default), for:UIBarMetrics.default) navigationBar.isTranslucent = UINavigationBar.appearance().isTranslucent navigationBar.shadowImage = UINavigationBar.appearance().shadowImage } } 

我尝试了上面的所有方法,仍然得到了空白,而不是应该呈现的内容。 如果你想绘制常规的子视图(谷歌地图fe),而不是通过导航栏的UIScrollView内容,那么你需要在viewDidAppear设置子视图的框架。 所以第一步:

 existingNavigationBar.setBackgroundImage(transparentImageFromAssets, for: .default) existingNavigationBar.shadowImage = transparentImageFromAssets existingNavigationBar.isTranslucent = true 

第2步:

 override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) self.mapView.frame = UIScreen.main.bounds 

}

这对我有效。