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

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

[[UINavigationBar appearance]
            setBackgroundImage:navigationBarTileImage forBarMetrics:UIBarMetricsDefault];

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

[[UINavigationBar appearanceWhenContainedIn: [MyViewControllerBase class], [MyViewController1 class], [MyViewController2 class], nil]
    setBackgroundImage:navigationBarTileImage forBarMetrics:UIBarMetricsDefault];

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

最佳答案
appearanceWhenContainedIn:的参数表示视图(和/或视图控制器)包含层次结构,而不是可能容器的列表. (不可否认,the docs对此并不清楚.见the video from WWDC 2011.)因此,

[UINavigationBar appearanceWhenContainedIn:[NSArray arrayWithObjects:[MyViewControllerBase class], [MyViewController1 class], [MyViewController2 class], nil]]

为您提供MyViewControllerBase中包含的UINavigationBar的外观代理,该代理又位于MyViewController2内的MyViewController1中.我猜这不是你拥有的收容等级.

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

[UINavigationBar apperanceWhenContainedIn:[NSArray arrayWithObject:[UINavigationController class]]]

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

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

转载注明原文:ios – UINavigationBar:外观有效但不是UINavigationBar:appearanceWhenContained in - 代码日志