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

时间:2012-08-07 22:00:20

标签: ios

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

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

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

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

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

2 个答案:

答案 0 :(得分:21)

appearanceWhenContainedIn:的参数表示视图(和/或视图控制器)包含层次结构,而不是可能容器的列表。 (诚​​然,the docs对此并不清楚。请参阅the video from WWDC 2011。)因此,

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

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

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

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

因为那样你也会得到邮件/邮件控制器。遗憾的是,当你可以到达邮件/邮件视图控制器中的UINavigationBar的外观代理时,没有办法告诉它撤消更多的外观更改通用级别。

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

答案 1 :(得分:0)

确实,就像@rickster所说,appearanceWhenContainedIn:方法自定义包含在容器类实例中的类实例的外观,或层次结构中的实例。

并非在每种情况下都有一组要自定义的包含类,但不同的容器。能够自定义多个组件的解决方案只需创建一个需要自定义的类的数组,然后进行迭代!像这样:

NSArray *navigationClass = [NSArray arrayWithObjects:[BSNavigationController class], [DZFormNavigationController class], nil];

for (Class class in navigationClass)
{
    //// Customize all the UINavigationBar background image tilling
    [[UINavigationBar appearanceWhenContainedIn:class, nil] setBackgroundImage:[UIImage imageNamed:@"yourImage"] forBarMetrics:UIBarMetricsDefault];
    [[UINavigationBar appearanceWhenContainedIn:class, nil] setTintColor:[UIColor blackColor]];

    // Title Text Attributes
    NSDictionary *titleAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                     [UIColor whiteColor], UITextAttributeTextColor,
                                     [UIColor darkGrayColor], UITextAttributeTextShadowColor,
                                     [UIFont boldSystemFontOfSize:20.0], UITextAttributeFont,
                                     [NSValue valueWithUIOffset:UIOffsetMake(0, 1)], UITextAttributeTextShadowOffset,nil];

    //// Customize all the UINavigationBar title attributes
    [[UINavigationBar appearanceWhenContainedIn:class, nil] setTitleTextAttributes:titleAttributes];
}