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 appearance
为YES
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]; }];
以上答案都不适用于我。
我有两个问题。
- 黑色状态栏
- 标题栏上的透明图层
解
-
黑色状态 – 我删除所有的导航栏定制
//在AppDelegate下面的注释行
[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@“nav_bg”] forBarMetrics:UIBarMetricsDefault];
-
透明标题栏 – 设置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
,但在这种情况下使用起来并不那么容易。 出现模式时,您可能更喜欢使用UIApplication
的statusBarHidden
属性。
[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 } }