iOS 7状态栏中的MFMailComposeViewController是黑色的

我有我的ios 7应用程序与MFMailComposeViewController反馈button。 用户点击此button后,邮件合并器打开,但状态栏变为黑色。 有谁知道我能做什么?

我只有与ios7这个问题。 我定制我的应用程序的ios7。

MFMailComposeViewController *mailController = [[MFMailComposeViewController alloc] init]; mailController.mailComposeDelegate = self; [mailController setSubject:@"Feedback"]; // Fill out the email body tex NSString *emailBody = [NSString stringWithFormat:@"testest"], [UIDevice currentDevice].model, [UIDevice currentDevice].systemVersion]; [mailController setMessageBody:emailBody isHTML:NO]; [mailController setToRecipients:[NSArray arrayWithObjects:@"support@test.com",nil]]; dispatch_async(dispatch_get_main_queue(), ^{ [self presentModalViewController:mailController animated:YES]; } 

在您的MFMailComposeViewController的presentViewController的完成块中设置UIApplication statusBarStyle。 即

  MFMailComposeViewController *mailVC = [[MFMailComposeViewController alloc] init]; [self.navigationController presentViewController:mailVC animated:YES completion:^{ [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; }]; 

您可能还需要在Info.plist文件中将“基于视图控制器的状态栏外观”添加和/或设置为NO。

尝试将类别添加到MFMailComposeViewController

编辑:这个解决scheme工作,如果“查看基于控制器的状态栏外观”==是

 @implementation MFMailComposeViewController (IOS7_StatusBarStyle) -(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } -(UIViewController *)childViewControllerForStatusBarStyle { return nil; } @end 

迅速的解决scheme。 将View controller-based status bar appearanceYES

 import UIKit import MessageUI import AddressBookUI extension MFMailComposeViewController { override func preferredStatusBarStyle() -> UIStatusBarStyle { return .LightContent } override func childViewControllerForStatusBarStyle() -> UIViewController? { return nil } } extension ABPeoplePickerNavigationController { override func preferredStatusBarStyle() -> UIStatusBarStyle { return .LightContent } override func childViewControllerForStatusBarStyle() -> UIViewController? { return nil } } 

我的伎俩是:

  • 子类MFMailComposeViewController
  • 按照答案6所述覆盖这两种方法

    -(UIStatusBarStyle)preferredStatusBarStyle;

    -(UIViewController *)childViewControllerForStatusBarStyle;

  • 覆盖viewDidLoad如下:

    -(void)viewDidLoad {
    [super viewDidLoad];
    [self preferredStatusBarStyle];
    [self setNeedsStatusBarAppearanceUpdate];
    }

有时它不会正确更新状态栏样式。 你应该使用

  [self setNeedsStatusBarAppearanceUpdate]; 

要说iOS手动刷新状态栏样式。 希望有人能省下一些时间来了解它。

 [self presentViewController:picker animated:YES completion:^{ [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; [self setNeedsStatusBarAppearanceUpdate]; }]; 

以上答案都不适用于我。

我有两个问题。

  1. 黑色状态栏
  2. 标题栏上的透明图层

在这里输入图像说明

  1. 黑色状态 – 我删除所有的导航栏定制

    //在AppDelegate下面的注释行

    [UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@“nav_bg”] forBarMetrics:UIBarMetricsDefault];

  2. 透明标题栏 – 设置navigationBarHidden =是MFMailComposeViewController

    composeViewController.navigationBarHidden = YES;

似乎初始化MFMailComposeViewController UIApplication.shared.statusBarStyle将更改为.default …所以,保存之前的状态,再设置后解决了问题对我来说:

  // save the state, otherwise it will be changed let sbs = UIApplication.shared.statusBarStyle let mailComposerVC = MailComposerVC() mailComposerVC.navigationBar.barTintColor = UINavigationBar.appearance().barTintColor mailComposerVC.navigationBar.tintColor = UINavigationBar.appearance().tintColor mailComposerVC.navigationBar.barStyle = UINavigationBar.appearance().barStyle if MFMailComposeViewController.canSendMail() { APP_ROOT_VC?.present(mailComposerVC, animated: true, completion: { // reapply the saved state UIApplication.shared.statusBarStyle = sbs }) } public class MailComposerVC: MFMailComposeViewController { public override var preferredStatusBarStyle: UIStatusBarStyle { return UIApplication.shared.statusBarStyle } public override var childViewControllerForStatusBarStyle : UIViewController? { return nil } } 

解决scheme为Swift3

添加到您的ViewController:

 extension MFMailComposeViewController { open override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } open override var childViewControllerForStatusBarStyle: UIViewController? { return nil } } 

设置View controller-based status bar appearance >> YES,如下所示:

在这里输入图像说明

感谢@SoftDesigner

另一个更清洁的解决scheme,可能不会改变您的应用程序的其他设置 在呈现邮件VC时,在完成块中更改状态栏:

 controller.present(mailComposeViewController, animated: true) { UIApplication.shared.statusBarStyle = .lightContent } 

iOS 7引入了一个方法prefersStatusBarHidden ,但在这种情况下使用起来并不那么容易。 出现模式时,您可能更喜欢使用UIApplicationstatusBarHidden属性。

 [self presentViewController:mailViewController animated:YES completion:^(void) { [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; }]; 

在我的情况下,我使用“基于视图控制器的状态栏外观”,并呈现一个模式视图控制器与自定义segue过渡, 然后从那里呈现MFMailComposeViewController。 在这种情况下,默认情况下,iOS仅尊重/使用呈现或“根”视图控制器的preferredStatusBarStyle方法。

所以一旦我覆盖了我的根视图控制器中的childViewControllerForStatusBarStyle 我的模式视图控制器中的preferredStatusBarStyle ,一切都按预期工作…像这样:

 // in RootViewController.m ... - (UIViewController *)childViewControllerForStatusBarStyle { return self.modalViewController; } // in ModalViewController.m ... - (UIStatusBarStyle)preferredStatusBarStyle { if (self.mailController != nil) return UIStatusBarStyleDefault; return UIStatusBarStyleLightContent; } 

我正在iOS8中构build一个应用程序,并且在状态栏中存在与所有本地函数(如邮件编辑器,相机等)有关的问题。以下内容将解决您的问题:

把以下内容放在你的plist文件中

  <key>UIStatusBarHidden</key> <false/> <key>UIViewControllerBasedStatusBarAppearance</key> <false/> 

如果在故事板中使用添加行function,则不能selectUIViewControllerBasedStatusBarAppearance。 另外,当添加一行时,它要求BOOLEAN(YES / NO)。 它不能是源代码中的NOstring,它必须是假的布尔值。 打开plist作为源代码,并添加上面的行。 删除旧的尝试。 您现在将能够成功应用在networking上发现的许多不完整答案中给出的代码片段。

您现在可以在应用程序委托文件中添加全局更改和/或覆盖控制器本身。 如果没有上面的代码,我所尝试的所有堆栈溢出代码在使用本地函数时都失败了。 现在一切正常。

作为一个testing,用任何机上的“完成”呼叫replace任何呼叫

  completion:^{[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];} 

对我来说最简单的快速解决scheme是:

 extension MFMailComposeViewController { open override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) UIApplication.shared.statusBarStyle = .lightContent } }