59

我的 ios 7 应用程序中有一个带有 MFMailComposeViewController 的反馈按钮。用户单击此按钮后,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];
}
4

13 回答 13

143

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

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

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

于 2013-10-04T19:32:24.170 回答
58

尝试将类别添加到 MFMailComposeViewController

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

@implementation MFMailComposeViewController (IOS7_StatusBarStyle)

-(UIStatusBarStyle)preferredStatusBarStyle
{
   return UIStatusBarStyleLightContent;
}

-(UIViewController *)childViewControllerForStatusBarStyle
{
   return nil;
}

@end
于 2013-09-25T12:52:26.927 回答
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
    }
}
于 2015-10-29T14:00:32.437 回答
7

对我来说诀窍是:

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

    -(UIStatusBarStyle)preferredStatusBarStyle;

    -(UIViewController *)childViewControllerForStatusBarStyle;

  • 覆盖 viewDidLoad 如下:

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

于 2013-11-09T19:26:39.247 回答
7

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

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

controller.present(mailComposeViewController, animated: true) {
            UIApplication.shared.statusBarStyle = .lightContent
        }
于 2017-03-14T22:27:25.203 回答
5

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

 [self setNeedsStatusBarAppearanceUpdate];

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

[self presentViewController:picker animated:YES completion:^{
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
     [self setNeedsStatusBarAppearanceUpdate];
}];
于 2014-03-12T08:20:50.763 回答
2

对我来说最简单的swift 3解决方案是:

extension MFMailComposeViewController {

    open override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        UIApplication.shared.statusBarStyle = .lightContent
    }
}
于 2017-08-18T11:46:47.223 回答
1

以上答案都不适合我。

我有两个问题。

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

在此处输入图像描述

解决方案

  1. 黑色状态- 我删除了所有导航栏自定义

    // 在 AppDelegate 中的下面的行注释

    [[UINavigationBar 外观] setBackgroundImage:[UIImage imageNamed:@"nav_bg"] forBarMetrics:UIBarMetricsDefault];

  2. 透明标题栏- 为 MFMailComposeViewController 设置 navigationBarHidden = Yes

    composeViewController.navigationBarHidden = YES;

于 2014-12-31T11:40:21.567 回答
1

似乎初始化 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
        }
    }
于 2016-11-15T12:11:45.553 回答
0

iOS 7 引入了一种方法prefersStatusBarHidden,但在这种情况下使用起来不会那么容易。您可能更喜欢在显示模式时使用 的statusBarHidden属性UIApplication

于 2013-09-22T15:25:55.343 回答
0
[self presentViewController:mailViewController animated:YES completion:^(void) { [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; }];
于 2014-04-02T11:30:22.567 回答
0

在我的例子中,我使用“基于视图控制器的状态栏外观”并呈现一个带有自定义 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;
}
于 2014-11-18T11:27:28.053 回答
0

我正在 iOS8 中构建一个应用程序,并且在状态栏的所有本机功能(如邮件编写器、相机等)方面遇到问题。以下将解决您的问题:

将以下内容放入您的 plist 文件中

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

如果您在情节提要中使用添加行功能,则 UIViewControllerBasedStatusBarAppearance 不是一个选项。此外,当添加一行时,它会要求 BOOLEAN (YES/NO)。它不能是源代码中的 NO 字符串,它必须是 false 布尔值。改为将 plist 作为源代码打开并添加上述行。删除您的旧尝试。您现在将能够成功应用在网上找到的许多不完整答案中给出的代码片段。

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

作为测试,将对任何板载“完成”调用的任何调用替换为

    completion:^{[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];}
于 2015-01-02T07:01:59.820 回答