Обновление задержки NavigationBar barTintColor iOS10

Контекст:

Скажем, у нас есть один NavigationController и 2 viewControllers. ViewControllerA имеет синюю навигационную панель, а ViewControllerB имеет зеленый цвет.

Я установил их так:

override func viewWillAppear(_ animated: Bool) {
        self.navigationController?.navigationBar.barTintColor = UIColor.blue    // Green if ViewController B
    }

Это хорошо работает, когда я получил от A до B, но когда я вернусь, theTalkBar teint обновляется после. Например, если он был настроен в viewDidAppear.

Ожидаемое:

На навигационной панели должен быть обновлен цвет навигационной панели без задержки.

Решения:

  • Я видел этот qaru.site/info/359057/... пост, и я попробовал решение. Это сработало, но сделало бы управление навигационной панелью более сложным и болезненным. (в реальном приложении)

  • Я попытался изменить тэп-навигатор в методе ViewWillDisappear. Не работает.

Дополнительно:

Это вызвано изменением API ios10. Я прочитал примечания к выпуску, но пока неясно, что делать в этом случае.

В iOS 10 UIKit имеет обновленное и унифицированное фоновое управление для UINavigationBar, UITabBar и UIToolbar. В частности, изменения фоновые свойства этих представлений (например, фон или тень изображения или настройка стиля бара) может начать прохождение макета для для разрешения нового фона.

В частности, это означает, что попытки изменить внешний вид этих баров внутри layoutSubviews, - [UIView updateConstraints], viewWillLayoutSubviews, viewDidLayoutSubviews, updateViewConstraints, или любой другой метод, который вызывается в ответ на макет, может привести к цикл компоновки.

В некоторых случаях вы можете разбить эти схемы компоновки, гарантируя, что вы всегда используйте один и тот же экземпляр объекта, когда объекты (такие как UIImage или UIColor). Но в целом вам следует избегать этого.

Вопрос:

Каким будет лучший способ обработки изменений панели навигации между различными контроллерами навигации в iOS 10?

Ответ 1

Попробуйте этот код:

Примечание: Код протестирован в Swift 3.

В ViewController A:

    override var isViewLoaded: Bool {
    title = "View 1"
    navigationController?.navigationBar.barTintColor = .blue
    navigationController?.navigationBar.isTranslucent = true
    navigationController?.navigationBar.tintColor = UIColor.white
    navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.white]
    UIApplication.shared.statusBarStyle = .lightContent
    self.navigationController?.navigationBar.barStyle = .black // In case statusbar Light content wont work.
    return true
    }

В ViewController B:

    override var isViewLoaded: Bool {
    title = "View 2"
    navigationController?.navigationBar.barTintColor = .green
    navigationController?.navigationBar.tintColor = .white
    navigationController?.navigationBar.isTranslucent = true
    navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.white]
    return true
    }

Выход: Не задерживайся, что так всегда...

введите описание изображения здесь

Образец изображения как TintColor.

В ViewController A:

 navigationController?.navigationBar.barTintColor = UIColor(patternImage: UIImage(named: "viewOneImage.jpg")!)

В ViewController B:

 navigationController?.navigationBar.barTintColor = UIColor(patternImage: UIImage(named: "viewTwoImage.jpg")!)

Вывод:

введите описание изображения здесь