当导航栏为大标题时,不应用 barTintColor

tkh*_*elm 2 uinavigationbar ios swift uinavigationbarappearance

我正在更新一个在 Xcode 10 上编译并在 iOS 13 上正常运行的应用程序。我想进行一些更改,因此在 Xcode 11 上重新编译,但现在 barTintColor 出现问题。

如果“大标题”设置为“始终”,则不会应用我的自定义 barTintColor - 我只会获得默认的灰色。如果“大标题”设置为“从不”,我的自定义 barTintColor 将按预期应用。如果“大标题”设置为“自动”,则显示大标题时导航栏默认为灰色,显示小标题时导航栏为我的自定义颜色。例如,当我的导航栏下方的TableView被向上推时,默认的大标题切换为小标题,并且我的导航栏改变颜色。正常行为是它始终是我的自定义颜色。

我的 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)

}
Run Code Online (Sandbox Code Playgroud)

知道行为发生变化的原因以及如何解决吗?

tkh*_*elm 8

glotcha 指出的苹果文档对于解决该问题至关重要,尽管还有更多内容。setNavigationBarItems()这是适用于 iOS 13 的my 的更新版本:

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

我的案例的一个关键点是我的导航栏(在自动布局中)设置为“大标题”为“自动”。这使得必须包含该.scrollEdgeAppearance线,以便在从大过渡到紧凑时应用自定义外观。事实证明,这条.compactAppearance线不是必需的,因为我对两者使用了相同的颜色。如果我想要大型和紧凑的不同外观设置,那么一条线.compactAppearance也很有用。