web-dev-qa-db-ja.com

iOS 7ステータスバーのMFMailComposeViewControllerは黒です

iOS 7アプリケーションにMFMailComposeViewControllerを備えたフィードバックボタンがあります。ユーザーがこのボタンをクリックすると、メール作成者は開きますが、ステータスバーは黒に変わります。誰が私に何ができるか考えていますか?

この問題は、ios7でのみ発生します。 iOS 7用にアプリをカスタマイズします。

    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:@"[email protected]",nil]];

            dispatch_async(dispatch_get_main_queue(), ^{
                [self presentModalViewController:mailController animated:YES];
}
59
NoBody

MFMailComposeViewControllerのpresentViewControllerの完了ブロックでUIApplication statusBarStyleを設定します。つまり.

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

また、Info.plistファイルで「View Controller-basedステータスバーの外観」をNOに追加または設定する必要があります。

143
Keller

MFMailComposeViewControllerにカテゴリを追加してみてください

編集:このソリューションは、「コントローラーベースのステータスバーの外観を表示する」== YESの場合に機能します

@implementation MFMailComposeViewController (IOS7_StatusBarStyle)

-(UIStatusBarStyle)preferredStatusBarStyle
{
   return UIStatusBarStyleLightContent;
}

-(UIViewController *)childViewControllerForStatusBarStyle
{
   return nil;
}

@end
58
Igor Palaguta

迅速なソリューション。セットする 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
    }
}
25
SoftDesigner

私にとってトリックは何でしたか:

  • サブクラスMFMailComposeViewController
  • 回答6で説明されている2つのメソッドをオーバーライドします

    -(UIStatusBarStyle)preferredStatusBarStyle;

    -(UIViewController *)childViewControllerForStatusBarStyle;

  • 次のようにviewDidLoadをオーバーライドします。

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

7
user1769627

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:

enter image description here

@SoftDesignerに感謝

アプリの他の設定を変更しない別のcleanerソリューション。メールを提示しながらVC完了ブロックのステータスバーを変更します。

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

ステータスバーのスタイルが適切に更新されない場合があります。あなたが使用する必要があります

 [self setNeedsStatusBarAppearanceUpdate];

ステータスバーのスタイルを手動で更新するようにiOSに指示するには。誰かがそれを知る時間をいくらか節約することを願っています。

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

私にとって最も簡単なSwiftソリューションは:

extension MFMailComposeViewController {

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

        UIApplication.shared.statusBarStyle = .lightContent
    }
}
2
kalafun

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
        }
    }
1
Marco M

上記の答えはどれも私にとってはうまくいきません。

2つの問題があります。

  1. 黒のステータスバー
  2. タイトルバーの透明レイヤー

enter image description here

解決

  1. ブラックステータス-ナビゲーションバーのカスタマイズをすべて削除します

    // AppDelegateの行の下にコメント

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

  2. 透明タイトルバー-MFMailComposeViewControllerのnavigationBarHidden = Yesを設定します

    composeViewController.navigationBarHidden = YES;

1
Kirit Vaghela

私の場合、「View Controllerベースのステータスバーの外観」を使用し、カスタムセグエ遷移を備えたモーダルView Controllerを提示し、thenMFMailComposeViewControllerを提示しましたそこから。この状況では、デフォルトで、iOSはpresentingまたは「ルート」View ControllerのpreferredStatusBarStyleメソッドのみを尊重/使用します。

ルートビューコントローラーでchildViewControllerForStatusBarStyleをオーバーライドするとandモーダルビューコントローラーでpreferredStatusBarStyleがすべて正常に機能しました... このようなもの:

// in RootViewController.m ...
- (UIViewController *)childViewControllerForStatusBarStyle {
    return self.modalViewController;
}

// in ModalViewController.m ...
- (UIStatusBarStyle)preferredStatusBarStyle {
    if (self.mailController != nil)
        return UIStatusBarStyleDefault;
    return UIStatusBarStyleLightContent;
}
0
taber
[self presentViewController:mailViewController animated:YES completion:^(void) { [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; }];
0
Praveen-K

iOS 7にはprefersStatusBarHiddenメソッドが導入されていますが、この場合はそれほど簡単に使用できません。モーダルが表示されているときに、statusBarHiddenUIApplicationプロパティを使用することをお勧めします。

0
Wain

IOS8でアプリケーションを構築していますが、メールコンポーザー、カメラなどのすべてのネイティブ機能を備えたステータスバーに問題があります。次の問題を解決します。

Plistファイルに以下を入力します

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

ストーリーボードで行の追加機能を使用している場合、UIViewControllerBasedStatusBarAppearanceはオプションではありません。また、行を追加するときに、ブール(YES/NO)を要求します。ソースコードでNO文字列にすることはできません。偽のブール値でなければなりません。代わりにソースコードとしてplistを開き、上記の行を追加します。古い試行を削除します。これで、ネット上で見つかった非常に多くの不完全な回答に含まれるコードスニペットを正常に適用できるようになります。

アプリのデリゲートファイルにグローバルな変更を追加したり、コントローラー自体にオーバーライドしたりできます。上記の設定がなければ、ネイティブ関数を使用するときに、私が試したすべてのスタックオーバーフローコードが失敗しました。今、すべてが完璧に機能しています。

テストとして、オンボードの「完了」呼び出しへの呼び出しを

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