9

我有一个外观代理,将barTintColor属性设置为绿色UINavigationBar

[[UINavigationBar appearance] setBarTintColor:[UIColor colorWithRed:54./255 green:165./255 blue:53./255 alpha:1]];

根据需要,我使用appearanceWhenContainedIn:

[[UINavigationBar appearanceWhenContainedIn:[INFSearchViewController class], nil] setBarTintColor:[UIColor colorWithWhite:0.80 alpha:1]];

这工作正常。

但是,当我展示MFMessageComposeViewController它时,它会遵循UINavigationBar代理并如下所示。

在此处输入图像描述

这显然看起来很糟糕,我宁愿MFMessageComposeViewController不遵守代理但尝试这样做

[[UINavigationBar appearanceWhenContainedIn:[MFMessageComposeViewController class], nil] setBarTintColor:[UIColor whiteColor]];

没有影响。

我应该在这里采取什么行动?

4

2 回答 2

6

hacky方法:将外观设置回默认白色,呈现模态,当模态返回时将外观设置为样式。

或者,扭转你的想法。将全局外观保留为默认值。然后,您可以在适当的地方有选择地应用样式化的导航栏。

如果“在适当的地方”最终占据了应用程序的 90%,只需设置一个 UIViewController 的薄子类(或您经常使用的任何视图控制器),然后在您想要的外观处使用它。

[[UINavigationBar appearanceWhenContainedIn:[MyStyledViewController class], nil] 
  setBarTintColor:[UIColor colorWithRed:54./255 green:165./255 blue:53./255 alpha:1]];

在每个 .h 文件中,将您的视图控制器超类设置为MyStyledViewController而不是普通的 old UIViewController

于 2013-09-26T19:00:54.787 回答
5

在四处挖掘并尝试了一些不同的建议之后,我使用 UINavigationController 子类找到了一个不错的、非 hacky 的解决方案。

这允许我使用外观代理设置所有想要的导航栏的样式,除了MFMessageComposeViewControllerMFMailComposeViewController更喜欢看起来标准的导航栏,以便与用户交流他们正在使用核心 iOS 功能。

1 - 创建一个UINavigationController子类。

2 - 使用外观代理设置导航栏的样式,但现在使用外观时包含:

[[UINavigationBar appearanceWhenContainedIn:[KCStyledNavController class], nil] setBarTintColor:[UIColor redColor]];
[[UINavigationBar appearanceWhenContainedIn:[KCStyledNavController class], nil] setTintColor:[UIColor whiteColor]];

3 - 进入您的故事板,选择所有UINavigationControllers您想要样式的并将其自定义类更改为您的样式。

于 2014-09-02T06:32:43.343 回答