透明导航栏故障

时间:2018-04-05 06:49:55

标签: ios swift uinavigationbar transparency

我需要让某些视图控制器中的导航栏透明(但条形按钮可见)。

我为此写了以下扩展名。

extension UINavigationBar {
    func setTransparent(_ flag: Bool) {
        if flag == true {
            setBackgroundImage(UIImage(), for: .default)
            shadowImage = UIImage()
            backgroundColor = .clear
            isTranslucent = true
        } else {
            setBackgroundImage(nil, for: .default)
        }
    }
}

导航栏的默认样式如下:

UINavigationBar.appearance().isTranslucent = false
UINavigationBar.appearance().tintColor = .white
UINavigationBar.appearance().barTintColor = UIColor(red: 45/255, green: 93/255, blue: 131/255, alpha: 1)
UINavigationBar.appearance().titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]

这一切都很好。但如果我必须关闭透明效果,那就会出现问题。

在第一个视图控制器中说我不需要导航栏是透明的。

class FirstViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        navigationController?.navigationBar.setTransparent(false)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.navigationBar.isTranslucent = false
    }
}

我从这里推送到第二个视图控制器。在这里,导航栏是透明的。

class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        navigationController?.navigationBar.setTransparent(true)
    }

}

现在,当我弹回到上一个视图控制器时,我必须将isTranslucent属性显式设置为false。我在viewWillAppear中执行此操作,您可以在第一个代码段中看到。

但问题是,当导航栏发生时,导航栏会显示黑色。

enter image description here

我希望这一切顺利。我该如何避免这种情况?

演示项目已上传here

我尝试了here描述的解决方案来解决类似的问题。但它并没有完全解决我的问题。黑条已经消失,但导航栏不会像以前一样出现,因为您可以看到here

3 个答案:

答案 0 :(得分:4)

您看到的黑色导航栏实际上是导航控制器视图背景颜色。尝试在第一个视图控制器videDidLoad方法

中添加此代码
navigationController?.view.backgroundColor = navigationController?.navigationBar.barTintColor

答案 1 :(得分:1)

设置导航控制器视图背景颜色确实为我解决了黑色问题,但是弹出视图控制器时我仍然遇到“延迟”问题。

我通过在弹出的视图控制器的willMove方法上更改我的NavigationController的主题来解决此问题。像这样:

override func willMove(toParent parent: UIViewController?) {
    super.willMove(toParent: parent)
    guard parent == nil,
          let navController = self.navigationController else {
            return
    }

    navController.navigationBar.isTranslucent = false
    navController.view.backgroundColor = backgroundColor
    navController.navigationBar.barTintColor = barColor
    navController.navigationBar.tintColor = tintColor
}

答案 2 :(得分:1)

在我使用Push之前

     if let navigator = self.navigationController {
           navigator.navigationBar.setBackgroundImage(UIImage(), for: .default)
           navigator.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.black]
           navigator.pushViewController(viewController, animated: true)
     }

这可以使故障消失,正常工作...

请注意,我的背景颜色是白色