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

NoB*_*ody 59 ios ios7 mfmailcomposeviewcontroller

我在带有MFMailComposeViewController的ios 7应用程序中有一个反馈按钮.用户单击此按钮后,mailcomposer将打开,但状态栏将更改为黑色.有谁知道我该怎么办?

我只有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];
}
Run Code Online (Sandbox Code Playgroud)

Kel*_*ler 143

在presentViewController的完成块中为MFMailComposeViewController设置UIApplication statusBarStyle.即

    MFMailComposeViewController *mailVC = [[MFMailComposeViewController alloc] init];
    [self.navigationController presentViewController:mailVC animated:YES completion:^{
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    }];
Run Code Online (Sandbox Code Playgroud)

您可能还需要在Info.plist文件中添加和/或设置"查看基于控制器的状态栏外观"为NO.

  • [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; 现在已弃用,所以我不知道该怎么办 (4认同)

Igo*_*uta 58

尝试将类别添加到MFMailComposeViewController

编辑:如果"查看基于控制器的状态栏外观"== YES,此解决方案有效

@implementation MFMailComposeViewController (IOS7_StatusBarStyle)

-(UIStatusBarStyle)preferredStatusBarStyle
{
   return UIStatusBarStyleLightContent;
}

-(UIViewController *)childViewControllerForStatusBarStyle
{
   return nil;
}

@end
Run Code Online (Sandbox Code Playgroud)

  • 这有效!我添加了完全相同的类别,`childViewControllerForStatusBarStyle`做得很好!没有它虽然没有任何反应. (5认同)
  • 这对我也有用.如果你想让设置全局化,Keller的答案将会有效,但如果你不这样做,那么这个就可以了. (3认同)
  • 您不应该覆盖类别中的现有方法.这会导致意外行为.你可以在这里阅读更多相关信息:https://www.mikeash.com/pyblog/friday-qa-2010-01-29-method-replacement-for-fun-and-profit.html (2认同)

Sof*_*ner 25

迅捷解决方案.设置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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您想要更广泛的解决方案,您可以改为扩展UINavigationController并覆盖preferredStatusBarStyle和childViewControllerForStatusBarStyle.这适用于MFMailComposeViewController和通过短信和打印共享时显示的共享表.(我没有测试过ABPeoplePickerNavigationController,因为我没有在我的应用程序中使用它.) (2认同)
  • 在Swift 3中:扩展名MFMailComposeViewController {覆盖open var preferredStatusBarStyle:UIStatusBarStyle {return .lightContent}覆盖open var childViewControllerForStatusBarStyle:UIViewController?{return nil}} (2认同)

小智 7

对我来说诀窍是:

  • 子类MFMailComposeViewController
  • 覆盖答案6中描述的两种方法

    -(UIStatusBarStyle)preferredStatusBarStyle;

    -(UIViewController *)childViewControllerForStatusBarStyle;

  • 覆盖viewDidLoad如下:

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


Tun*_*Fam 7

Swift3的解决方案

将其添加到ViewController:

extension MFMailComposeViewController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

感谢@SoftDesigner

另一种清洁解决方案,可能不会更改您应用中的其他设置.在呈现Mail VC时,更改完成块中的状态栏:

controller.present(mailComposeViewController, animated: true) {
            UIApplication.shared.statusBarStyle = .lightContent
        }
Run Code Online (Sandbox Code Playgroud)


Vij*_*com 5

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

 [self setNeedsStatusBarAppearanceUpdate];
Run Code Online (Sandbox Code Playgroud)

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

[self presentViewController:picker animated:YES completion:^{
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
     [self setNeedsStatusBarAppearanceUpdate];
}];
Run Code Online (Sandbox Code Playgroud)