59

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];
}
4

13 に答える 13

143

MFMailComposeViewController の presentViewController の完了ブロックで UIApplication statusBarStyle を設定します。すなわち

    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 にカテゴリを追加してみてください

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

@implementation MFMailComposeViewController (IOS7_StatusBarStyle)

-(UIStatusBarStyle)preferredStatusBarStyle
{
   return UIStatusBarStyleLightContent;
}

-(UIViewController *)childViewControllerForStatusBarStyle
{
   return nil;
}

@end
于 2013-09-25T12:52:26.927 に答える
7

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

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

    -(UIStatusBarStyle)preferredStatusBarStyle;

    -(UIViewController *)childViewControllerForStatusBarStyle;

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

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

于 2013-11-09T19:26:39.247 に答える
5

ステータス バーのスタイルが正しく更新されない場合があります。使用する必要があります

 [self setNeedsStatusBarAppearanceUpdate];

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

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

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

2 つの問題があります。

  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

私は 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 に答える
0

私の場合、「ビュー コントローラー ベースのステータス バーの外観」を使用し、モーダル ビュー コントローラーをカスタム セグエ トランジションで提示し、そこから MFMailComposeViewController を提示していましたこの状況では、デフォルトで、iOS は提示または「ルート」View Controller の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
[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 に答える