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];
}
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に追加または設定する必要があります。
MFMailComposeViewControllerにカテゴリを追加してみてください
編集:このソリューションは、「コントローラーベースのステータスバーの外観を表示する」== YESの場合に機能します
@implementation MFMailComposeViewController (IOS7_StatusBarStyle)
-(UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
-(UIViewController *)childViewControllerForStatusBarStyle
{
return nil;
}
@end
迅速なソリューション。セットする 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
}
}
私にとってトリックは何でしたか:
回答6で説明されている2つのメソッドをオーバーライドします
-(UIStatusBarStyle)preferredStatusBarStyle;
-(UIViewController *)childViewControllerForStatusBarStyle;
次のようにviewDidLoadをオーバーライドします。
-(void)viewDidLoad {
[super viewDidLoad];
[self preferredStatusBarStyle];
[self setNeedsStatusBarAppearanceUpdate];
}
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に感謝
アプリの他の設定を変更しない別のcleanerソリューション。メールを提示しながらVC完了ブロックのステータスバーを変更します。
controller.present(mailComposeViewController, animated: true) {
UIApplication.shared.statusBarStyle = .lightContent
}
ステータスバーのスタイルが適切に更新されない場合があります。あなたが使用する必要があります
[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
}
}
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
}
}
上記の答えはどれも私にとってはうまくいきません。
2つの問題があります。
解決
ブラックステータス-ナビゲーションバーのカスタマイズをすべて削除します
// AppDelegateの行の下にコメント
[[UINavigationBarの外観] setBackgroundImage:[UIImage imageNamed:@ "nav_bg"] forBarMetrics:UIBarMetricsDefault];
透明タイトルバー-MFMailComposeViewControllerのnavigationBarHidden = Yesを設定します
composeViewController.navigationBarHidden = YES;
私の場合、「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;
}
[self presentViewController:mailViewController animated:YES completion:^(void) { [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; }];
iOS 7にはprefersStatusBarHidden
メソッドが導入されていますが、この場合はそれほど簡単に使用できません。モーダルが表示されているときに、statusBarHidden
のUIApplication
プロパティを使用することをお勧めします。
IOS8でアプリケーションを構築していますが、メールコンポーザー、カメラなどのすべてのネイティブ機能を備えたステータスバーに問題があります。次の問題を解決します。
Plistファイルに以下を入力します
<key>UIStatusBarHidden</key>
<false/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
ストーリーボードで行の追加機能を使用している場合、UIViewControllerBasedStatusBarAppearanceはオプションではありません。また、行を追加するときに、ブール(YES/NO)を要求します。ソースコードでNO文字列にすることはできません。偽のブール値でなければなりません。代わりにソースコードとしてplistを開き、上記の行を追加します。古い試行を削除します。これで、ネット上で見つかった非常に多くの不完全な回答に含まれるコードスニペットを正常に適用できるようになります。
アプリのデリゲートファイルにグローバルな変更を追加したり、コントローラー自体にオーバーライドしたりできます。上記の設定がなければ、ネイティブ関数を使用するときに、私が試したすべてのスタックオーバーフローコードが失敗しました。今、すべてが完璧に機能しています。
テストとして、オンボードの「完了」呼び出しへの呼び出しを
completion:^{[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];}