透明导航栏故障

Isu*_*uru 6 transparency uinavigationbar ios swift

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

我为此编写了以下扩展名。

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

我的导航栏的默认样式如下。

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]
Run Code Online (Sandbox Code Playgroud)

所有这些工作正常。但是如果我必须关闭透明效果,就会出现问题。

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

class FirstViewController: UIViewController {

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

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.navigationBar.isTranslucent = false
    }
}
Run Code Online (Sandbox Code Playgroud)

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

class SecondViewController: UIViewController {

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

}
Run Code Online (Sandbox Code Playgroud)

现在,当我弹回之前的视图控制器时,我必须将isTranslucent属性显式设置为false. viewWillAppear正如您在第一个代码片段中看到的那样,我是这样做的。

但问题是,当它发生时,导航栏是黑色的。

在此处输入图片说明

我希望这很顺利。我如何避免这种情况?

演示项目在这里上传。


我尝试使用此处描述的解决方案来解决类似问题。但这并不能完全解决我的问题。黑条消失了,但导航栏没有像以前一样出现一秒钟,正如您在此处看到的那样。

小智 7

你看到的黑色导航栏实际上是导航控制器视图背景色。尝试在第一个视图控制器videDidLoad方法中添加此代码

navigationController?.view.backgroundColor = navigationController?.navigationBar.barTintColor
Run Code Online (Sandbox Code Playgroud)