覆盖MFMailComposeViewController的UIAppearance属性

17

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

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

我想要覆盖MFMailComposeViewController实例,以便显示默认样式的导航栏。我尝试使用appearanceWhenContainedIn来设置它,在iOS 5上可以工作,但不行iOS6.

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

我是否犯了错误或者有更好的方法来完成这个任务?


根据苹果开发者支持:这是iOS 7.0中已知的一个错误。 - jasonjwwilliams
1
这个问题在iOS 9中已经修复。 - Climbatize
3个回答

24

通过正常的方法无法改变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];
    }
}

在您的代理中,将接口改回原来的样子。


Translated content:

在您的代理中,将接口改回原来的样子。

- (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
2
@Ziconic,你能告诉我如何在运行时“取消设置”你的UIAppearance属性吗?谢谢。 - Pavan
在我的情况下,这个逻辑适用于 setBarTintColor,而不是 setTintColor。 - Dipen Desai

2

在iOS 6中,邮件编辑器视图在不同的进程中运行,不能直接进行更改(因为该视图本质上在另一个应用程序内)。您无法自定义其显示内容,Twitter和Facebook视图也是如此。

以下是远程视图控制器的更详细说明:http://oleb.net/blog/2012/10/remote-view-controllers-in-ios-6/


3
虽然它在远程进程中运行,但这是一个对开发人员不可见的实现细节;就开发者而言,它看起来和之前一样。如果它无法正常工作,我建议您提交错误报告;我知道远程视图控制器机制至少会通过UIAppearance机制进行某些操作,因为我有相关的崩溃日志。 :) - BJ Homer
主视图确实在不同的进程中,但导航栏和导航控制器在您的应用程序中与同一进程,并根据您的UIAppearance自定义进行样式设置。 - Ziconic
@BJHomer,我已经提交了一个雷达报告。如果需要,可以重复提交。rdar://13490724 - markdorison

1
只需在MFMailComposeViewController实例上设置tintColor即可:
[mailInstance.navigationBar setTintColor:[UIColor someColor]];

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