barTintColor не применяется, когда NavigationBar имеет большие заголовки - PullRequest
1 голос
/ 22 марта 2020

Я обновляю приложение, которое было скомпилировано в Xcode 10 и работает нормально до iOS 13. Я хотел внести некоторые изменения, перекомпилированные в Xcode 11, и теперь у меня проблема с barTintColor.

Если для параметра «Большие заголовки» установлено значение «Всегда», мой пользовательский barTintColor не применяется - я просто получаю серый по умолчанию. Если для параметра «Большие заголовки» установлено значение «Никогда», мой пользовательский barTintColor будет применен, как и ожидалось. Если для параметра «Большие заголовки» установлено значение «Automati c», то по умолчанию NavBar отображается серым цветом, когда отображаются большие заголовки, и мой пользовательский цвет, когда отображаются маленькие заголовки. Например, когда 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)

}

Есть идеи, почему изменилось поведение и как его исправить?

Ответы [ 2 ]

1 голос
/ 22 марта 2020

Существует новый API с iOS 13 https://developer.apple.com/documentation/uikit/uinavigationbarappearance

Требуемое свойство backgroundColor находится в суперклассе https://developer.apple.com/documentation/uikit/uibarappearance

Некоторые дополнительные примеры кода здесь https://developer.apple.com/documentation/uikit/uinavigationcontroller/customizing_your_app_s_navigation_bar

0 голосов
/ 22 марта 2020

Документация Apple, на которую указывал Глотча, имела решающее значение для решения этой проблемы, хотя и здесь было немного больше. Вот обновленная версия моей setNavigationBarItems (), которая работает в iOS 13:

    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
    }

Ключевым моментом в моем случае было то, что моя навигационная панель установлена ​​(в Autolayout) с 'Большие заголовки' как ' автоматизац c». Это делает необходимым включение строки .scrollEdgeAppearance, чтобы пользовательский внешний вид применялся при переходе от большого к компактному. Оказалось, что строка .compactAppearance не требуется, потому что я использую один и тот же цвет для обоих. Если бы я хотел разные настройки внешнего вида для больших и компактных, то полезной была бы строка с .compactAppearance.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...