UIAppearance ", если не содержится в"

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

Мое использование пользовательского протокола отображения UIBarButton FlatUIKit вызывает MFMailComposerViewController жалобы и прекращение работы.

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

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

Ответ 1

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

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

Как и в SDK IOS 9, есть также

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

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

UIBarButton.appearance().barTintColor = UIColor.redColor()
UIBarButton.appearanceWhenContainedInInstancesOfClasses([MFMailComposerViewController.self]).barTintColor = nil

Ответ 2

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

[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor darkGrayColor]];

Ответ 3

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

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

class CustomizedNavigationController: UINavigationController {}

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

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

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

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