Настройка UINavigationBar не работает из-за странной иерархии представлений UINavigationBar

В моем приложении много ViewController'ов, которые помещаются в стек навигации.

Я настроил внешний вид UINavigationBar глобально в AppDelegate, как показано ниже.

let appearance = UINavigationBar.appearance()
appearance.barTintColor = myColor
appearance.tintColor = .white
appearance.isTranslucent = false
let textAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white,
                      NSAttributedString.Key.font: myFont, size: mySize)]
appearance.titleTextAttributes = textAttributes as [NSAttributedString.Key : Any]

Все ViewController работают должным образом, кроме одного ViewController.

Ниже приведен один из VC, который работает как положено. Он показывает нужный мне цвет и шрифт.

А ниже - ViewController, который выглядит иначе, чем другие.

Я не могу понять причину, по которой только одна панель навигации в этом VC показывает другой вид.

Итак, я сделал отладку иерархии представлений.

Ниже представлена ​​иерархия представлений венчурных капиталистов, которая работает должным образом.

А ниже представлена ​​иерархия представлений VC, которая выглядит странно.

Как видно на рисунке, проблемная панель навигации имеет еще два уровня: UIVisualEffectView и UIVisualEffectBackdropView.

Я опытный разработчик iOS и понятия не имею, почему это происходит.

Я внимательно проверил все настройки, связанные с NavigationBar на IB, но не нашел отличий от других.

Я даже удалил ViewController, полностью внедрил NavigationController и безуспешно пересобирал их с нуля.

Пожалуйста, объясните мне, почему только этот NavigationBar имеет другую структуру.

Я работаю над iOS 13.3 и Xcode 11.3.1

1 ответ

Работая здесь на iOS15, я пробовал много вещей, чтобы настроить внешний вид панели навигации, чтобы добиться простого непрозрачного цвета, кроме этого ничего не работало:

В viewDidLoad

      if (@available(iOS 13.0, *)) {
        UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
         appearance.backgroundColor = [UIColor orangeColor];
        self.navigationController.navigationBar.standardAppearance = appearance;
        self.navigationController.navigationBar.scrollEdgeAppearance = appearance;
}

Быстрая версия:

      let appearance = UINavigationBarAppearance()
appearance.backgroundColor = .orange
navigationBar.standardAppearance = appearance;
navigationBar.scrollEdgeAppearance = navigationBar.standardAppearance

Наконец, если вы хотите применить это только к текущему контроллеру и восстановить панель навигации по умолчанию, просто сделайте то же самое, но с новым UINavigationBarAppearance () в viewWillDisappear.

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