Уже довольно давно, начиная с iOS 5, у программистов появился удобный механизм стилизации внешнего вида компонентов интерфейсов – UIAppearance.
Например, вот так легко установить белый цвет для кнопок и заголовка на всех UINavigationBar и наследниках:
1 2 |
[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]]; [[UINavigationBar appearance] setTitleTextAttributes: @{NSForegroundColorAttributeName:[UIColor whiteColor]}]; |
И это замечательный и удобный инструмент, так как влияет глобально на всё приложение. Если вам требуется изменять только определенные элементы, то можно либо сделать для них соответствующий субкласс от стандартного, либо воспользоваться методом
1 |
+ (instancetype)appearanceWhenContainedInInstancesOfClasses:(NSArray> *)containerTypes |
который применит указанные параметры только к тем элементам, что вложены в объекты соответствующих классов.
Пример из документации:
1 2 |
[[UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[[UISplitViewController class]]] setBarTintColor:myColor]; [[UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[[UITabBarController class], [UISplitViewController class]]] setBarTintColor:myTabbedNavBarColor]; |
И всё работает замечательно, до того момента, когда в дело вступает один нюанс, описанный в документации:
NOTE
iOS applies appearance changes when a view enters a window, it doesn’t change the appearance of a view that’s already in a window. To change the appearance of a view that’s currently in a window, remove the view from the view hierarchy and then put it back.
Как это свойство влияет на подход к использованию данных методов?
Читать далее Изменение визуальных свойств существующих объектов через протокол UIAppearance