【发布时间】:2018-08-28 22:48:32
【问题描述】:
当我推送UIViewController 并将UINavigationBar 颜色更改为透明时,我在iOS 11 上发现了一个奇怪的行为。重要的是我正在使用largeTitles。
我想将导航栏的红色更改为透明,效果很好。
但是,如果我点击 backButton,再次禁用透明样式和红色样式,就会发生不好的事情。 ViewController 上的 NavigationBar 不是红色但仍然是透明的。
正如@Menoor Ranpura 建议的那样,我添加了另一行,它还设置了
UIViewController中的backgroundColor视图-当您设置与UINavigationBar相同的颜色时,这是一个很好的解决方法。但是,这不是问题的解决方案,因为导航栏的大部分仍然是透明的。当您为背景设置不同的颜色时,您可以看到它。例如,我设置了黄色。您可以在此处查看示例:
问题
当prefersLargeTitles设置为true时,如何正确地将导航栏颜色从透明改为红色?
代码
class ExampleTableTableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "reuseID")
navigationController?.navigationBar.redNavigationBar()
title = "Red NavBar"
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
view.backgroundColor = .yellow
navigationController?.navigationBar.redNavigationBar()
}
}
//Transparent Navigation bar controller
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
title = "Transparent NavBar"
view.backgroundColor = .blue
self.navigationController?.navigationBar.prefersLargeTitles = true
}
override func viewWillAppear(_ animated: Bool) {
self.navigationController?.navigationBar.transparentNavigationBar()
}
}
extension UINavigationBar {
func redNavigationBar() {
setBackgroundImage(nil, for: .default)
shadowImage = nil
prefersLargeTitles = true
tintColor = .white
largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
barTintColor = .red
}
func transparentNavigationBar() {
setBackgroundImage(UIImage(), for: .default)
shadowImage = UIImage()
}
}
我已经测试过的一些技巧:
- 当
prefersLargeTitles设置为false时一切正常 - 当
prefersLargeTitles设置为true时一切正常,但navigationBar更改在非透明颜色之间。例如,如果在绿色 黄色 之间切换
- 我不想将
backgroundColor设置为可见。这不是一个解决方案,而是一种解决方法。
在这里你可以看到来自 XCode 的屏幕:
有趣的事实是,有一个叫做:_UINavigationBarLargeTitleView 的东西是透明的。 如何访问它?
相关问题:
您可以在此处找到示例项目:https://github.com/kamwysoc/LargeTitlesNavigationBarTransition
更新指的是@Menoor Ranpura 的回答
@Menoor Ranpura 建议的代码是一种解决方法。像UINavigationBar 那样在UIViewController 视图上设置相同的backgroundColor 不是解决方案。但是,我走得更远,我将颜色更改为与 UINavigationBar 控制器不同的颜色。正如你在上面的 gif 中看到的,当largeTitle 出现时,导航栏变成黄色——这意味着它是透明的——因为我们能够看到视图的黄色背景。
【问题讨论】:
-
iOS 12 中仍然出现Bug。你提交雷达了吗?