UINavigationBar:外观有效但不是UINavigationBar:appearanceWhenContained in

Gru*_*kes 5 ios

我需要将导航栏设置为自定义颜色,以下代码将执行此操作:

[[UINavigationBar appearance]
            setBackgroundImage:navigationBarTileImage forBarMetrics:UIBarMetricsDefault];
Run Code Online (Sandbox Code Playgroud)

但是我的应用程序调用系统MFMailComposeViewController和MFMessageComposeViewController,我希望导航栏成为这些视图的默认颜色,所以我这样做:

[[UINavigationBar appearanceWhenContainedIn: [MyViewControllerBase class], [MyViewController1 class], [MyViewController2 class], nil]
    setBackgroundImage:navigationBarTileImage forBarMetrics:UIBarMetricsDefault];
Run Code Online (Sandbox Code Playgroud)

但是现在导航栏不再具有我的默认颜色.为什么外观当包含不起作用?

ric*_*ter 21

该参数appearanceWhenContainedIn:表示的图(和/或视图控制器)包含层次结构,而不是一个可能的容器的列表.(不可否认,文档对此并不清楚.请参阅WWDC 2011的视频.)因此,

[UINavigationBar appearanceWhenContainedIn:[NSArray arrayWithObjects:[MyViewControllerBase class], [MyViewController1 class], [MyViewController2 class], nil]]
Run Code Online (Sandbox Code Playgroud)

为你提供一个UINavigationBar包含在a中的外观代理MyViewControllerBase,反过来在a MyViewController1MyViewController2.我猜这不是你拥有的收容等级.

相反,请查看包含导航栏的视图控制器.它可能是一个通用UINavigationController......但你不能这样做

[UINavigationBar apperanceWhenContainedIn:[NSArray arrayWithObject:[UINavigationController class]]]
Run Code Online (Sandbox Code Playgroud)

因为那时你也会得到邮件/消息控制器.遗憾的是,虽然您可以UINavigationBar邮件/邮件视图控制器中获取外观代理,但是没有办法告诉它撤消更通用级别的外观更改.

看起来这种情况的通常解决方案是使自己成为UINavigationController子类,并将其用于您想要换肤的UI部分.子类可以为空 - 它仅用于标识UI的部分内容appearanceWhenContainedIn:.(同时,像MFMailComposeViewController继续使用默认外观一样,因为它们仍然使用泛型UINavigationController.)