UIAppearance的“未包含在内”

时间:2013-10-16 16:19:30

标签: ios objective-c uikit uiappearance

我目前正在转动UIAppearance修饰符*的复杂网络,并遇到了问题。

我对FlatUIKit的自定义UIBarButton外观协议的使用导致MFMailComposerViewController抱怨并停止工作。

因此,不是使用UIAppearance的{​​{1}}方法来指定导致修改的类,有没有办法排除某些类,即“何时不包含”?

* 我说的是whenContainedIn协议,用于预定义应用代理中的对象外观设置。

3 个答案:

答案 0 :(得分:14)

您可以使用appearanceWhenContainedIn:指定nil修改,这将提供默认外观:

[[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

答案 1 :(得分:0)

对我来说,我使用的是iOS 10中的这个,

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

答案 2 :(得分:0)

我的解决方案是创建应用程序中使用的所有容器视图控制器的自定义子类作为主UIWindow子视图(窗口的根视图控制器或呈现的视图控制器),例如{{1} },UINavigationControllerUITabBarController

假设该应用仅使用UISplitViewController。创建一个子类:

UINavigationController

然后在应用中的任何地方使用class CustomizedNavigationController: UINavigationController {} 代替普通CustomizedNavigationController

此外,不是为每个UINavigationController指定外观,而是仅在包含在子类中时指定外观:

UIBarButton

由于UIBarButtonItem.appearance(whenContainedInInstancesOf: [CustomizedNavigationController.self]) 未使用子类,因此无法自定义。