我正在更新在Xcode 10上编译并可以在iOS 13上正常运行的应用程序。我想进行一些更改,以便在Xcode 11上重新编译,现在barTintColor出现问题。
如果“大标题”设置为“始终”,则不会应用我的自定义barTintColor -我只会得到默认的灰色。如果“大标题”设置为“从不”,则按预期应用我的自定义barTintColor。如果将“大标题”设置为“自动”,则在显示“大标题”时,导航栏为默认灰色,而在显示小标题时,导航栏为默认颜色。例如,当我的导航栏下面的TableView向上推时,默认的大标题将切换为小标题,而NavBar会更改颜色。正常的行为将始终是我的自定义颜色。
来自我的ViewController类的相关代码,最后一行是设置barTintColor的代码:
override func viewDidLoad() {
super.viewDidLoad()
setDelegates()
setTableViewHeightForCollapsingHeaders()
setNavigtionBarItems()
doSplitViewManagement()
}
override func viewWillAppear(_ animated: Bool) {
clearsSelectionOnViewWillAppear = splitViewController!.isCollapsed
super.viewWillAppear(animated)
updateUI()
}
fileprivate func setNavigtionBarItems() {
//set up UI buttons
navigationItem.leftBarButtonItem = editButtonItem
let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(insertNewObject(_:)))
navigationItem.rightBarButtonItem = addButton
navigationController?.navigationBar.barTintColor = UIColor(hex: 0x5da0a2)
}
知道为什么行为会改变以及如何解决?
[自iOS 13 https://developer.apple.com/documentation/uikit/uinavigationbarappearance起有一个新的API
您要查找的backgroundColor属性在超类中https://developer.apple.com/documentation/uikit/uibarappearance
这里有一些额外的示例代码https://developer.apple.com/documentation/uikit/uinavigationcontroller/customizing_your_app_s_navigation_bar
glotcha指向的Apple文档对解决该问题至关重要,尽管还有很多其他问题。这是可在iOS 13中使用的setNavigationBarItems()的更新版本:
fileprivate func setNavigtionBarItems() {
if #available(iOS 13.0, *) {
let appearance = UINavigationBarAppearance()
appearance.configureWithDefaultBackground()
appearance.backgroundColor = myBackgroundColor
navigationController?.navigationBar.standardAppearance = appearance
navigationController?.navigationBar.scrollEdgeAppearance = appearance
//navigationController?.navigationBar.compactAppearance = appearance
} else {
// Fallback on earlier versions
navigationController?.navigationBar.barTintColor = myBackgroundColor
}
在我的案例中,关键点是我的导航栏设置为(自动布局中)“大标题”为“自动”。这使得必须包括.scrollEdgeAppearance行,以便自定义外观从大到紧凑过渡时适用。事实证明,不需要.compactAppearance行,因为我对两者都使用相同的颜色。如果我想为大而紧凑的外观设置不同,那么带有.compactAppearance的行也将很有用。