Обновление задержки 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")!)
Вывод:
![введите описание изображения здесь]()