透明导航栏故障
Transparent navigation bar glitch
我需要使某些视图控制器中的导航栏透明(但栏按钮可见)。
我为此编写了以下扩展。
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
中执行此操作。
但问题是,当它发生时,导航栏会黑一秒钟。
我希望这一切顺利。我该如何避免这种情况?
演示项目已上传here。
我尝试了 to a similar question. But it doesn't completely fix my issue. The black bar is gone but the navigation bar doesn't appear for a second just like before as you can see here 中描述的解决方案。
你看到的黑色导航栏其实是导航控制器视图的背景色。尝试在第一个视图控制器 viewDidLoad
方法
中添加此代码
navigationController?.view.backgroundColor = navigationController?.navigationBar.barTintColor
设置导航控制器视图背景颜色确实解决了我的黑色问题,但在弹出视图控制器时我仍然遇到 "delay" 问题。
我通过在弹出的视图控制器的 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
}
在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)
}
这使故障消失,工作正常...
请注意,在我的案例中,背景颜色是白色
我需要使某些视图控制器中的导航栏透明(但栏按钮可见)。
我为此编写了以下扩展。
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
中执行此操作。
但问题是,当它发生时,导航栏会黑一秒钟。
我希望这一切顺利。我该如何避免这种情况?
演示项目已上传here。
我尝试了
你看到的黑色导航栏其实是导航控制器视图的背景色。尝试在第一个视图控制器 viewDidLoad
方法
navigationController?.view.backgroundColor = navigationController?.navigationBar.barTintColor
设置导航控制器视图背景颜色确实解决了我的黑色问题,但在弹出视图控制器时我仍然遇到 "delay" 问题。
我通过在弹出的视图控制器的 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
}
在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)
}
这使故障消失,工作正常...
请注意,在我的案例中,背景颜色是白色