【问题标题】:Override UIAppearance property for MFMailComposeViewController覆盖 MFMailComposeViewController 的 UIAppearance 属性
【发布时间】:2013-03-12 21:41:13
【问题描述】:

我正在使用 UIAppearance 协议在整个应用程序中设置 UINavigationBar 对象的背景图像。

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"image-name"] forBarMetrics:UIBarMetricsDefault];

我想为 MFMailComposeViewController 的实例覆盖它,以便显示默认样式导航栏。我尝试使用 appearanceWhenContainedIn 进行设置,这适用于 iOS 5,但 not 在 iOS 6 上。

[[UINavigationBar appearanceWhenContainedIn:[MFMailComposeViewController class], nil] setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];

是我犯了错误还是有更好的方法来完成这个?

【问题讨论】:

  • 根据 Apple 开发人员支持:这是 iOS 7.0 中的一个已知错误。
  • 这已在 iOS 9 中修复

标签: ios objective-c cocoa-touch ios6 uiappearance


【解决方案1】:

无法通过常规措施更改 MFMailComposer 的外观,但您可以采取一些解决方法,我之前已经使用过很多次了。

向您希望在其中实现新外观的类添加两个方法:

- (void)applyComposerInterfaceAppearance
{
    [[UINavigationBar appearance] setTintColor:[UIColor blueColor]];
}

- (void)applyGlobalInterfaceAppearance
{
    // My default color of choice
    [[UINavigationBar appearance] setTintColor:[UIColor redColor]];
}

现在在您的 show 方法中,应用您想要进行的特殊作曲家界面更改。

- (void)showMailComposer
{
    if ([MFMailComposeViewController canSendMail]) 
    {
        [self applyComposerInterfaceApperance];

        MFMailComposeViewController *viewController = [[MFMailComposeViewController alloc] init];
        viewController.mailComposeDelegate = delegate;
        [viewController setToRecipients:mailRecepients];
        [viewController setSubject:mailSubject];
        [viewController setMessageBody:messageBody isHTML:NO];
        [self presentModalViewController:viewController animated:YES];
    }
}

在您的委托中,将界面改回原来的样子。

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
    // Do normal mail composer did finish stuff in here
    [self applyGlobalInterfaceAppearance];
}

【讨论】:

  • 这也是我在自己的应用程序中所做的。我的应用程序委托中有一对 setAppearance 和 unsetAppearance 方法,只要我需要提供标准的预烘焙视图控制器(邮件控制器、iPod 库选择器等),我就可以在任何地方调用它们来打开和关闭所有 UI 自定义。
  • @Ziconic,您能告诉我您是如何即时“取消设置”您的 uiappearance 属性的吗?谢谢
  • 在我的情况下,此逻辑适用于 setBarTintColor。不使用 setTintColor。
【解决方案2】:

Mail Composer 视图在 iOS 6 下运行在不同的进程中,不能直接被篡改(因为视图本质上是在另一个应用程序中)。您无法自定义它显示的内容,Twitter 和 Facebook 视图也是如此。

这里是远程视图控制器更详细的描述:http://oleb.net/blog/2012/10/remote-view-controllers-in-ios-6/

【讨论】:

  • 即使它是在远程进程中运行的,这是一个不向开发人员公开的实现细节;就开发者而言,它看起来和以前一样。如果它不起作用,我建议提交一个错误;我知道远程视图控制器机制至少对 UIAppearance 机制做了一些事情,因为我在那里有崩溃日志。 :)
  • 主视图确实在不同的进程中,但导航栏和它所在的导航控制器与您的应用程序在同一进程中,并根据您的 UIAppearance 自定义设置样式。
  • @BJHomer 我提交了雷达。随意欺骗。 rdar://13490724
【解决方案3】:

只需在 MFMailComposeViewController 实例上设置 tintColor:

[mailInstance.navigationBar setTintColor:[UIColor someColor]];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2013-07-19
    • 2014-01-17
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多