MFMessageComposeViewController外观在iOS 7中的表现

9
我有一个外观代理,将 UINavigationBarbarTintColor 属性设置为绿色。如有需要,我可以使用 appearanceWhenContainedIn: 对其进行覆盖。
这样做是有效的。然而,当我呈现一个 MFMessageComposeViewController 时,它会遵循 UINavigationBar 代理并显示出以下效果。
显然这看起来很糟糕,我希望 MFMessageComposeViewController 不要遵循代理,但尝试使用 [[UINavigationBar appearanceWhenContainedIn:[MFMessageComposeViewController class], nil] setBarTintColor:[UIColor whiteColor]]; 并没有任何作用。
在这种情况下,应该采取什么行动?

我对你的问题描述有点困惑。"显然很糟糕"这个术语让我感到困惑,因为它太模糊了。在我的眼里,iOS 7上的所有东西都看起来很糟糕——扁平化的外观、丑陋的键盘等等。那么,难以阅读的绿色文本是你试图避免的具体问题吗? - HalR
这是让UIAppearance代理在撰写消息视图中的导航栏上工作的问题。我不需要设计建议。它没有按照我期望的外观进行设置。 - Chris Wagner
1
详细的答案,附有截图。 - Uladzimir
2个回答

6

一种不太正规的方法是:将外观设置回默认白色,展示模态视图,当模态视图返回时再将外观设置为样式化。

或者,反向思考。将全局外观保留为默认值。然后,在适当的情况下可以有选择地应用样式化导航栏。

如果“适当的情况”最终占了应用的90%,只需设置UIViewController(或您经常使用的任何视图控制器)的轻量级子类,并在需要外观的地方使用它即可。

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

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

3
你也可以创建一个 UINavigationController 的子类并将其设置为你的导航控制器。这样,你就不必去更改所有的视图控制器了。 - Marcelo
@MarceloFabri,Greg的建议非常好,但我的UINavigationBarUINavigationController中却出现了问题,所以我做了一件看起来很合理的事情。正如你所提到的,创建了一个子类,并在其中包含我的子类时设置外观...然而,外观仍然没有应用。有什么想法吗? - Chris Wagner
1
好的,这个答案解决了问题。https://dev59.com/l2fWa4cB1Zd3GeqPcwWT#11856605 我必须单独指定出现方式。我以为我只需要提供一个列表,它就会应用于列表中的所有内容,而不是列表的分层顺序。 - Chris Wagner
感谢@ChrisWagner留下这个链接。 - Piotr Tomasik

5

在搜索并尝试了几个不同的建议后,我找到了一个很好的、非hacky的解决方案,使用了UINavigationController子类。

这使我能够一次性地使用外观代理来设置所有想要的导航栏样式,但是除了MFMessageComposeViewController和MFMailComposeViewController之外,我希望它们看起来标准,以便向用户传达他们正在使用核心iOS功能。

1- 创建一个UINavigationController子类。

2- 使用appearanceWhenContainedIn:来设置您的导航栏样式,就像您一直在做的那样。

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

3 - 进入您的Storyboard,选择所有您想要设计样式的UINavigationControllers并将它们的自定义类更改为您所设计的样式。


1
是的,这正是我采取的方法。也许在答案/评论中没有表述清楚。这似乎是最干净的方式。有趣的是,苹果公司说不要为他们的东西设置样式,但他们遵循你的外观代理。你会认为他们会阻止它们。 - Chris Wagner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接