一身转战三千里,一剑曾当百万师。这篇文章主要讲述覆盖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)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];
}
另一答案Mail Composer视图在iOS 6下的不同进程中运行,不能直接篡改(因为视图基本上位于另一个应用程序中)。您无法自定义它显示的内容,对于Twitter和Facebook视图也是如此。
以下是远程视图控制器的更详细说明:http://oleb.net/blog/2012/10/remote-view-controllers-in-ios-6/
另一答案【覆盖MFMailComposeViewController的UIAppearance属性】只需在MFMailComposeViewController实例上设置tintColor:
[mailInstance.navigationBar setTintColor:[UIColor someColor]];
推荐阅读
- 如何在TableRow中使用Android填充宽度制作切换按钮
- App Store和Ad Hoc已停用
- Appirater不要求审查
- 将本地db(Sqlite)与服务器db android同步
- Android系统。在按钮创建的操作完成之前,如何将按钮显示为PRESSED()
- Glassfish Android
- RadioButton Intent活动 - android
- android.widget.RadioGroup无法强制转换为android.widget.RadioButton
- Android(onResume更新单选按钮)