Swift中的透明UINavigationBar

时间:2015-05-30 11:34:47

标签: ios swift uinavigationbar

我想让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上做了这样的事情 - 它就可以了。

6 个答案:

答案 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中,您需要将基于控制器的状态栏外观定义为任何值。

enter image description here

UIApplication.shared.statusBarStyle = .lightContent

如果要隐藏状态栏:

UIApplication.shared.isStatusBarHidden = true

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

enter image description here

iPhone XR - Swift 4.2 - 大型标题(测试截图)

Large Titles - Swift - iPhone XR

答案 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
  }

这对我有用。