UIAppearance 的“当不包含在”中

Posted

技术标签:

【中文标题】UIAppearance 的“当不包含在”中【英文标题】:UIAppearance's "when not contained in" 【发布时间】:2013-10-16 16:19:30 【问题描述】:

我目前正在构建一个由 UIAppearance 修饰符* 组成的复杂网络,但遇到了一个问题。

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

因此,不是使用UIAppearancewhenContainedIn 方法来指定导致修改发生的类,有没有办法排除某些类,即“当不包含在其中时”?

*我说的是UIAppearance 协议,它用于在应用程序的委托中预定义对象外观设置。

【问题讨论】:

【参考方案1】:

您可以使用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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

我的解决方案是为应用中使用的所有容器视图控制器创建一个自定义子类,作为主要的UIWindow 子视图(窗口的根视图控制器或呈现的视图控制器),例如UINavigationController、@987654323 @ 或UISplitViewController

假设应用只使用UINavigationController。创建一个子类:

class CustomizedNavigationController: UINavigationController 

然后在应用程序的任何地方都使用CustomizedNavigationController 而不是普通的UINavigationController

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

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

因为MFMailComposerViewController 没有使用子类,所以不会自定义。

【讨论】:

以上是关于UIAppearance 的“当不包含在”中的主要内容,如果未能解决你的问题,请参考以下文章

不需要时如何摆脱 UIAppearance?

使用 UIAppearance 渲染图像

使用 UIAppearance 代理设置 UILabel 样式

使用 UIAppearance 和切换主题

除了在模态视图控制器中使用 UIAppearance 样式吗?

iOS - 防止 UIAppearance 设置更改 UIWebView 输入附件视图