Ответ
Протокол UIAppearance — это механизм в UIKit для централизованной настройки визуальных свойств элементов интерфейса во всем приложении или в определенных контейнерах.
Основное применение: Глобальное задание стилей (цвета, шрифты, тени) для всех экземпляров конкретного класса UI-компонентов.
Пример глобальной настройки:
// Установка стиля для ВСЕХ UINavigationBar в приложении
UINavigationBar.appearance().barTintColor = .systemBlue
UINavigationBar.appearance().tintColor = .white
UINavigationBar.appearance().titleTextAttributes = [
.foregroundColor: UIColor.white,
.font: UIFont.boldSystemFont(ofSize: 20)
]
Пример контекстной настройки:
// Настройка кнопок только внутри UINavigationBar
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).tintColor = .red
// Настройка кнопок только внутри UIToolbar
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UIToolbar.self]).tintColor = .green
Критические ограничения:
- Работает только со свойствами, помеченными в документации как
UI_APPEARANCE_SELECTOR. - Влияет только на экземпляры, созданные после применения настроек. Уже отображенные элементы не изменятся.
- Не подходит для динамической смены темы (светлая/тёмная) во время работы приложения. Для этой цели используйте
traitCollectionDidChangeили переход на SwiftUI. Рекомендация: Применяйте для базового брендинга приложения, а для сложной динамической стилизации создавайте кастомные подклассы или фабрики.