Xcode 11.4.

Я недавно обновил свой Xcode до 11.4. Когда я запустил приложение на устройстве, я заметил, что заголовки всех элементов навигации стали полностью черными при установке из раскадровки. введите описание изображения здесь

Вы не можете изменить ни один из кодов, следующая строка кода больше не работает

self.navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]

Я только заставляю это работать, используя некоторые вещи iOS 13 UINavigationBarAppearance

@available(iOS 13.0, *)
    private func setupNavigationBar() {
        let app = UINavigationBarAppearance()
        app.titleTextAttributes = [.foregroundColor: UIColor.white]
        app.backgroundColor = Constants.Color.barColor
        self.navigationController?.navigationBar.compactAppearance = app
        self.navigationController?.navigationBar.standardAppearance = app
        self.navigationController?.navigationBar.scrollEdgeAppearance = app

        self.navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]
    }

Может кто-нибудь объяснить мне, почему ??? Это критическая ошибка или какая-то новая скрытая функция?

Всего 3 ответа


Это исправило это для меня, используя вместо этого UINavigationBarAppearance из: Настройка панели навигации вашего приложения

if #available(iOS 13.0, *) {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithOpaqueBackground()
    appearance.backgroundColor = UIColor.black
    appearance.titleTextAttributes = [.foregroundColor: UIColor.white] // With a red background, make the title more readable.
    self.navigationBar.standardAppearance = appearance
    self.navigationBar.scrollEdgeAppearance = appearance
    self.navigationBar.compactAppearance = appearance // For iPhone small navigation bar in landscape.
} else {
    self.navigationBar.barTintColor = UIColor.black
    self.navigationBar.tintColor = UIColor.white
    self.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]
}

Примечание. Я вложил в класс UINavigationController , и он был вызван из переопределения viewWillAppear .

... или для AppDelegate , для всего приложения:

if #available(iOS 13.0, *) {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithOpaqueBackground()
    appearance.backgroundColor = UIColor.black
    appearance.titleTextAttributes = [
        NSAttributedStringKey.foregroundColor: UIColor.white
    ]

    let buttonAppearance = UIBarButtonItemAppearance()
    buttonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.white]
    appearance.buttonAppearance = buttonAppearance

    UINavigationBar.appearance().standardAppearance = appearance
    UINavigationBar.appearance().scrollEdgeAppearance = appearance
    UINavigationBar.appearance().compactAppearance = appearance

    UIBarButtonItem.appearance().tintColor = UIColor.white
} else {
    UINavigationBar.appearance().barTintColor = UIColor.black
    UINavigationBar.appearance().titleTextAttributes = [
        NSAttributedStringKey.foregroundColor: UIColor.white
    ]
    UINavigationBar.appearance().tintColor = UIColor.white

    UIBarButtonItem.appearance().tintColor = UIColor.white
}

Не уверен, что это ошибка или нет.

Мы исправили это, установив «Стиль строки состояния» на темное или светлое содержимое в настройках проекта. Это заставит цвет текста строки состояния определенным образом, а не будет определяться на основе устройств, находящихся в режиме «Светлый» или «Темный».

Кроме того, вам нужно установить значение «Просмотр внешнего вида строки состояния на основе контроллера» на «НЕТ» в вашем Info.plist. без этого значения «Стиль строки состояния» будет переопределен.

Затем создайте пользовательский контроллер навигации и внедрите его в свои раскадровки.

class CustomNavigationController: UINavigationController {

 override func viewDidLoad() {
    super.viewDidLoad()
    setNavBar()
 }

 func setNavBar() {
    if #available(iOS 13.0, *) {
        let appearance = UINavigationBarAppearance()
        appearance.configureWithOpaqueBackground()
        appearance.backgroundColor = UIColor.blue
        appearance.titleTextAttributes = [.foregroundColor: UIColor.yellow]
        self.navigationBar.standardAppearance = appearance
        self.navigationBar.scrollEdgeAppearance = appearance
        self.navigationBar.compactAppearance = appearance
    } else {
        self.navigationBar.barTintColor = UIColor.blue
        self.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.yellow]
    }
  }
}

* Цвета установлены так, чтобы вы могли видеть их четко работающими.

Я обнаружил, что лучше установить код в ViewDidLoad, а не в ViewDidAppear, потому что мои цвета не устанавливались при первоначальной загрузке, только после перехода назад и перезагрузки.

Я также обнаружил, что эта проблема может быть связана с «Bar Tint» NavBar. когда мы впервые пытались ее решить, мы установили «Bar Tint» на значение по умолчанию, и это, похоже, тоже разрешило ошибку. Тем не менее, он сделал это так, что мы не смогли получить цвет фона NavBar, что мы хотели. Поэтому в своих раскадровках я позаботился о том, чтобы установить это значение по умолчанию просто для хорошей меры.

Надеюсь, поможет


На раскадровке для вашего контроллера навигации измените «Bar Tint» на значение «Default», затем в своем коде вы можете изменить его, как обычно.


Есть идеи?

10000