Сбой прозрачной панели навигации

Мне нужно сделать панель навигации в некоторых контроллерах представления прозрачной (но с видимыми кнопками панели).

Я написал для этого следующее расширение.

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 05.04.2018 08:52

@Nitish Спасибо. Но, к сожалению, это полностью не исправляет, по крайней мере, в моем случае. Черная полоса исчезла. Но все же панель навигации не появляется ни на секунду, как вы можете видеть здесь.

Isuru 05.04.2018 09:19

@Isuru Решите ли вы последнюю часть проблемы, когда панель навигации не появляется ни на секунду?

andrey.krukovskiy 29.10.2018 11:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
3
1 912
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Черная панель навигации, которую вы видите, на самом деле является цветом фона представления контроллера навигации. Попробуйте добавить этот код в метод 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)
     }

это заставляет сбой исчезать, работает нормально ...

обратите внимание: в моем случае цвет фона был белым

Другие вопросы по теме