【问题标题】:Transparent navigation bar glitch透明导航栏故障
【发布时间】:2018-04-05 06:49:55
【问题描述】:

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

我为此编写了以下扩展。

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。正如您在第一个代码 sn-p 中看到的那样,我在 viewWillAppear 中执行此操作。

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

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

演示项目已上传here


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

【问题讨论】:

  • 检查this。我已经遇到过这种情况。
  • @Nitish 谢谢。但不幸的是,至少在我的情况下,它并没有完全解决它。黑条不见了。但是导航栏仍然没有出现一秒钟,你可以看到here
  • @Isuru 你解决了导航栏一秒钟不出现问题的最后一部分吗?

标签: ios swift uinavigationbar transparency


【解决方案1】:

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

navigationController?.view.backgroundColor = navigationController?.navigationBar.barTintColor

【讨论】:

    【解决方案2】:

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

    我通过在弹出的视图控制器的 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
    }
    

    【讨论】:

      【解决方案3】:

      在推送之前我使用

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

      这使故障消失工作正常...

      注意我的背景颜色是白色

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-21
        • 2020-09-19
        相关资源
        最近更新 更多