不能在MFMailComposeViewController上更改UIStatusBarStyle

3

我目前使用iOS 7中的机制,在UINavigationController子类上定义(UIStatusBarStyle)preferredStatusBarStyle选择器,以控制以模态方式呈现的视图中状态栏的外观(返回UIStatusBarStyleLightContent)。然而,使用MFMailComposeViewController实例时,我无法以任何方式影响状态栏的外观。

似乎问题在于MFMailComposeViewController的顶部视图是MFMailComposeInternalViewController,它是私有且未经记录的,并且似乎不应该被更改。尝试对其进行子类化或创建类别会生成编译器错误。它的preferredStatusBarStyleUIStatusBarStyleDefault,但我想要的是UIStatusBarStyleLightContent

其他答案建议将"View controller-based status bar appearance"的plist值设置为NO,但这样会影响我的应用程序的其他部分。有没有办法改变这个状态栏的外观呢?


我认为你不应该去修改MFMailComposerViewController或MessageComposerViewController,因为它们是苹果的版权或者说是"财产"。 - user2277872
我有同样的问题。你找到解决方法了吗? - Stephen
2个回答

2
自iOS6以来,MFMailComposeViewController实际上并不是一个真正的视图控制器,或者说,它不持有邮件撰写视图控制器的真正视图层级结构。相反,它是一个远程视图控制器的代理,完全由另一个进程使用XPC绘制。
即使您覆盖或交换MFMailComposeViewController类中的方法,也无法影响其行为。这是苹果故意为之。
有关远程视图控制器和XPC的更多信息,请参见此处: http://oleb.net/blog/2012/10/remote-view-controllers-in-ios-6/

1
将类别添加到MFMailComposeViewController(而不是MFMailComposeInternalViewController),以提供所需的preferredStatusBarStyle对我有用,并且没有生成任何编译错误或警告。
请参阅此问题以获取我参考的原始答案: 在iOS 7中状态栏为黑色的MFMailComposeViewController

你是否也启用了UIViewControllerBasedStatusBarAppearance?这是使其正常工作的先决条件。 - lintmachine
如果我启用此参数,则应用程序中所有控制器的状态栏字体颜色都会变为黑色。[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];将停止工作。
  • (UIStatusBarStyle)preferredStatusBarStyle {     return UIStatusBarStyleLightContent; }
也无法解决问题。
- Yarlik
1
这不是一个可靠的解决方案,因为类别不应该用于覆盖现有方法:https://dev59.com/WW435IYBdhLWcg3wrSPN#5272612 - erikprice
子类化 MFMailComposeViewController 是否合法? - igrek

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