Мне нужно сделать панель навигации в некоторых контроллерах представления прозрачной (но с видимыми кнопками панели).
Я написал для этого следующее расширение.
extension UINavigationBar {
func setTransparent(_ flag: Bool) {
if flag == true {
setBackgroundImage(UIImage(), for: .default)
shadowImage = UIImage()
backgroundColor = .clear
isTranslucent = true
} else {
setBackgroundImage(nil, for: .default)
}
}
}
Стили по умолчанию для моих панелей навигации следующие.
UINavigationBar.appearance().isTranslucent = false
UINavigationBar.appearance().tintColor = .white
UINavigationBar.appearance().barTintColor = UIColor(red: 45/255, green: 93/255, blue: 131/255, alpha: 1)
UINavigationBar.appearance().titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
Все это прекрасно работает. Но есть проблема, если мне нужно отключить эффект прозрачности.
Скажем, в первом контроллере представления мне не нужно, чтобы панель навигации была прозрачной.
class FirstViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.setTransparent(false)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.navigationBar.isTranslucent = false
}
}
Я нажимаю на второй контроллер представления отсюда. Здесь панель навигации прозрачная.
class SecondViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.setTransparent(true)
}
}
Теперь, когда я возвращаюсь к предыдущему контроллеру представления, мне нужно явно установить для свойства isTranslucent значение false. Я делаю это в viewWillAppear, как вы можете видеть в первом фрагменте кода.
Но проблема в том, что панель навигации на секунду становится черной, когда это происходит.
Я хочу, чтобы все прошло гладко. Как мне этого избежать?
Демо-проект загружен здесь.
Я попробовал решение, описанное здесь на аналогичный вопрос. Но это не решает полностью мою проблему. Черная полоса исчезла, но панель навигации не появляется ни на секунду, как раньше, как вы можете видеть здесь.
@Nitish Спасибо. Но, к сожалению, это полностью не исправляет, по крайней мере, в моем случае. Черная полоса исчезла. Но все же панель навигации не появляется ни на секунду, как вы можете видеть здесь.
@Isuru Решите ли вы последнюю часть проблемы, когда панель навигации не появляется ни на секунду?





Черная панель навигации, которую вы видите, на самом деле является цветом фона представления контроллера навигации. Попробуйте добавить этот код в метод videDidLoad контроллера первого представления
navigationController?.view.backgroundColor = navigationController?.navigationBar.barTintColor
Установка цвета фона представления контроллера навигации устранила для меня проблему с черным цветом, но у меня все еще была проблема «задержки» при открытии контроллера представления.
Я исправил это, изменив тему моего NavigationController на метод willMove всплывающего контроллера представления. Что-то вроде этого:
override func willMove(toParent parent: UIViewController?) {
super.willMove(toParent: parent)
guard parent == nil,
let navController = self.navigationController else {
return
}
navController.navigationBar.isTranslucent = false
navController.view.backgroundColor = backgroundColor
navController.navigationBar.barTintColor = barColor
navController.navigationBar.tintColor = tintColor
}
Перед нажатием я использую
if let navigator = self.navigationController {
navigator.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigator.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.black]
navigator.pushViewController(viewController, animated: true)
}
это заставляет сбой исчезать, работает нормально ...
обратите внимание: в моем случае цвет фона был белым
Отметьте это. Я уже сталкивался с этим.