我想让UINavigationBar
中的UINavigationController
透明化。我创建了一个UINavigationController
的子类,并喜欢它在我的storyboard文件中的一个场景。这是我的子类的一部分:
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
上做了这样的事情 - 它就可以了。
答案 0 :(得分:89)
希望对你有帮助
Swift 2:
self.navigationController.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
self.navigationController.navigationBar.shadowImage = UIImage()
self.navigationController.navigationBar.isTranslucent = true
self.navigationController.view.backgroundColor = UIColor.clearColor()
Swift 4.2
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.view.backgroundColor = UIColor.clear
或者如果您想要升级导航控制器,请参考此answer。
通过以下方式更改状态栏样式:
在Info.plist中,您需要将基于控制器的状态栏外观定义为任何值。
UIApplication.shared.statusBarStyle = .lightContent
如果要隐藏状态栏:
UIApplication.shared.isStatusBarHidden = true
通过轻量内容和透明导航获取此输出。我有查看背景是灰色的。你可以看到透明度。
iPhone XR - Swift 4.2 - 大型标题(测试截图)
答案 1 :(得分:29)
如果您使用的是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
答案 2 :(得分:5)
使用Xcode 8.1的Swift 3.0.1
在df.sort(asc("column_name"))
df.orderBy(asc("column_name"))
UINavigationController
答案 3 :(得分:5)
Xcode 8.x:Swift 3:扩展为相同 写一次使用
extension UINavigationBar {
func transparentNavigationBar() {
self.setBackgroundImage(UIImage(), for: .default)
self.shadowImage = UIImage()
self.isTranslucent = true
}
}
答案 4 :(得分:4)
创建UINavigationController
的扩展名并显示或隐藏透明导航栏。
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
}
}
答案 5 :(得分:0)
我尝试了上面的所有方法并且仍然获得了空白空间而不是应该通过渲染的内容。如果您想绘制常规子视图(Google map f.e.),而不是通过导航栏绘制UIScrollView内容,则需要在viewDidAppear
中设置子视图的框架。
所以第1步:
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
}
这对我有用。