覆盖MFMailComposeViewController的UIAppearance属性

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

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

我想重写这个MFMailComposeViewController的实例,以便显示默认样式导航栏。 我试图使用appearanceWhenContainedIn来设置这个,这适用于iOS 5,但不适用于iOS 6。

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

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

通过正常的措施改变MFMailComposer的外观是不可能的,但是你可以做一些小的解决方法,我曾经使用过很多次。

将两种方法添加到您希望实现新外观的类中:

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

现在在你的show方法中,应用你想要做的特殊的composer界面变化。

 - (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]; } 

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

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

只需在MFMailComposeViewController实例上设置tintColor:

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