透明的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
}
这对我有效。