5

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

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

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

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

但是现在导航栏不再有我的默认颜色。为什么appearanceWhenContainedIn 不起作用?

4

2 回答 2

21

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

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

为您提供UINavigationBar包含在 a 中的a 的外观代理MyViewControllerBase,而后者又在 aMyViewController1内部 aMyViewController2中。我猜这不是你所拥有的收容等级。

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

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

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

对于这种情况,通常的解决方案似乎是让自己成为一个UINavigationController子类,并将其用于您想要皮肤的 UI 部分。子类可以是空的——它的存在只是为了识别你的 UI 的一部分appearanceWhenContainedIn:。(同时,诸如MFMailComposeViewController继续使用默认外观之类的东西,因为它们仍然使用通用的UINavigationController.)

于 2012-08-08T01:53:13.827 回答
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];
}
于 2012-12-22T20:26:13.747 回答