Черный UINavigationBar в iOS 15

перевод статьи от Eduardo Santi

Это короткая статья которая поможет вам решить вопрос между версиями iOS 14 и iOS15 за 3 минуты.

 фотография от Lorenzo Rui с Unsplash

Введение

Финальная версия iOS 15 в итоге была публично выпущена 20 сентября и Apple представил много новых особенностей, как любой разработчик в экосистеме Apple, мы часто настраиваем наши приложения для предоставления удобного использования для наших пользователей.

Один из таких случаем связан с навигационной системой использующей UINavigationBar, в частности в приложении в котором я работаю на данный момент. Настройка навигационной панели не применялась как в случае с iOS 14, это стало сюрпризом.

После нескольких часов поиска, я вспомнил что с iOS 13 Apple представил класс настройки отображения(Appearance) в UIKit с названием UINavigationBarAppearance. Често, я е помнил об существовании данного класса, и на практике все разработчики iOS с кем я обращаюсь также не используют его. Как я сказал, давайте посмотрим как использовать этот класс если у вас есть навигационная панель до iOS 14.

. . .

Кодинг

Давайте настроим навигационную панель как делали ранее, получится что вроде такого:

// Название(title) Navigation Controller
title = "UINavigationBar on " + UIDevice.current.systemVersion

// Настройка нашего navigation bar
navigationController?.navigationBar.isTranslucent = false
navigationController?.navigationBar.tintColor = .white
navigationController?.navigationBar.barTintColor = .red
navigationController?.navigationBar.titleTextAttributes = [.font: UIFont.boldSystemFont(ofSize: 20.0),
                                                                   .foregroundColor: UIColor.white]

Этот код имеет разный результат между iOS 14 и iOS 15

iOS 14 и iOS 15

И сейчас  давайте посмотрим как мы может стандартизировать нашу навигационную панель в зависимости от версий iOS.

// Название(title) Navigation Controller
title = "UINavigationBar on " + UIDevice.current.systemVersion

let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
appearance.backgroundColor = .red
appearance.titleTextAttributes = [.font: UIFont.boldSystemFont(ofSize: 20.0),
                                  .foregroundColor: UIColor.white]

// Настройка нашего navigation bar
navigationController?.navigationBar.tintColor = .white
navigationController?.navigationBar.standardAppearance = appearance
navigationController?.navigationBar.scrollEdgeAppearance = appearance

Некоторое рассмотрение этого обновления:

  • Вам не нужно использовать свойство isTranslucent потому что мы указываем внешний вид как непрозрачный с использованием метода configureWithOpaqueBackground()
  • Мы должны использовать свойство titleTextAttributes настроек внешнего вида(Appearance) вместо навигационной панели
  • После настроек нового внешнего вида, мы определяем что навигационная панель будет получать эти настройки через свойство standartAppearance
  • Мы также может определить что навигационная панель будет посылать эти настройки если у нас есть подкласс и скролл навигационной панели

Теперь итоговый результат

обновленный iOS 14 и iOS 15

. . . 

Рассмотрение выходящие за рамки

Мы можем использовать такие же настройки отображения для других компонентов которые мы часто используем, таких как UITabBarApppearance в UIToolBarAppearance, потому что этот класс наследуется от UIBarAppearance как UINavigationBarAppearance что мы видели ранее. Для того чтобы посмотреть все классы которые могут быть настроены, вы можете обратиться к официальной документации Apple.

Надеюсь я способствовал нашему взаимодействию в данной статье. Если это было полезно для вам, распространите это другим разработчикам и не стесняйтесь подписываться на меня, комментировать и хлопать.