UIAppearance, когда он не содержится в

В настоящее время я плету сложную паутину из UIAppearance модификаторов* и столкнулся с проблемой.

Мое использование пользовательского протокола внешнего вида UIBarButton FlatUIKit приводит к тому, что MFMailComposerViewController жалуется и перестает работать.

Следовательно, вместо использования метода whenContainedIn UIAppearance для указания классов, вызывающих изменение, есть ли способ исключить определенные классы, то есть «когда они не содержатся в»?

*Я говорю о протоколе UIAppearance, который используется для предварительного определения параметров внешнего вида объекта в делегате приложения.


person Sarreph    schedule 16.10.2013    source источник


Ответы (3)


Вы можете использовать appearanceWhenContainedIn:, чтобы указать нулевую модификацию, которая даст внешний вид по умолчанию:

[[UIBarButton appearance] setBarTintColor:[UIColor redColor]];
[[UIBarButton appearanceWhenContainedIn:[MFMailComposerViewController class], nil] setBarTintColor:nil];

Начиная с iOS 9 SDK, также

[[UIBarButton appearance] setBarTintColor:[UIColor redColor]];
[[UIBarButton appearanceWhenContainedInInstancesOfClasses:@[[MFMailComposerViewController class]] setBarTintColor:nil];

Что можно использовать Swift-2 так:

UIBarButton.appearance().barTintColor = UIColor.redColor()
UIBarButton.appearanceWhenContainedInInstancesOfClasses([MFMailComposerViewController.self]).barTintColor = nil
person Leo Natan    schedule 16.10.2013

Для меня я использовал этот, который работает в iOS 10,

[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor darkGrayColor]];
person alitosuner    schedule 14.12.2016

Мое решение состоит в том, чтобы создать настраиваемый подкласс всех контроллеров представления контейнера, которые используются в приложении в качестве основных UIWindow подпредставлений (контроллер корневого представления окна или представленных контроллеров представления), таких как UINavigationController, UITabBarController или UISplitViewController.

Допустим, приложение использует только UINavigationController. Создайте подкласс:

class CustomizedNavigationController: UINavigationController {}

Затем используйте CustomizedNavigationController вместо обычного UINavigationController везде в приложении.

Кроме того, вместо того, чтобы указывать внешний вид для каждого UIBarButton, укажите внешний вид только в том случае, если он содержится в подклассе:

UIBarButtonItem.appearance(whenContainedInInstancesOf: 
                           [CustomizedNavigationController.self])

Поскольку MFMailComposerViewController не использует подкласс, он не будет настроен.

person Marián Černý    schedule 09.06.2017