web-dev-qa-db-fra.com

MFMailComposeViewController dans la barre d'état iOS 7 sont en noir

j'ai un bouton de commentaires dans mon application iOS 7 avec MFMailComposeViewController. Une fois que l'utilisateur a cliqué sur ce bouton, le composeur de courrier s'est ouvert, mais la barre d'état est devenue noire. Avez-vous une idée de ce que je peux faire?

j'ai ce problème uniquement avec iOS 7. Je personnalise mon application pour 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

Définissez UIApplication statusBarStyle dans le bloc d'achèvement de presentViewController pour votre MFMailComposeViewController. c'est à dire.

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

Vous devrez peut-être également ajouter et/ou définir "Afficher l'apparence de la barre d'état basée sur le contrôleur" sur NO dans votre fichier Info.plist. 

143
Keller

Essayez d'ajouter une catégorie à MFMailComposeViewController

EDIT: cette solution fonctionne si "Voir l'apparence de la barre d'état basée sur le contrôleur" == OUI

@implementation MFMailComposeViewController (IOS7_StatusBarStyle)

-(UIStatusBarStyle)preferredStatusBarStyle
{
   return UIStatusBarStyleLightContent;
}

-(UIViewController *)childViewControllerForStatusBarStyle
{
   return nil;
}

@end
57
Igor Palaguta

Solution rapide . Réglez View controller-based status bar appearance sur 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
    }
}
23
SoftDesigner

Quel a été le truc pour moi?

  • Sous-classe MFMailComposeViewController
  • Ignorez les deux méthodes décrites à la réponse 6

    -(UIStatusBarStyle)preferredStatusBarStyle;

    -(UIViewController *)childViewControllerForStatusBarStyle;

  • Remplacez viewDidLoad comme suit:

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

7
user1769627

Solution pour Swift3

Ajoutez ceci à votre ViewController: 

extension MFMailComposeViewController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return nil
    }
}

Définissez View controller-based status bar appearance >> OUI comme ci-dessous:

 enter image description here

Merci à @SoftDesigner

Une autre solution cleaner qui ne peut pas modifier les autres paramètres de votre application. Lors de la présentation du courrier VC, modifiez la barre d'état dans le bloc d'achèvement:

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

Parfois, le style de la barre d'état ne sera pas mis à jour correctement. Tu devrais utiliser 

 [self setNeedsStatusBarAppearanceUpdate];

Pour dire iOS pour actualiser le style de la barre d'état, manuellement. J'espère que quelqu'un gagnerait du temps à le savoir.

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

La solution la plus simple Swift 3 était la suivante:

extension MFMailComposeViewController {

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

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

Il semble que l'initialisation de UIApplication.shared.statusBarStyle de MFMailComposeViewController passe à .default ... donc enregistrer l'état avant et le rétablir après la présentation a résolu le problème pour moi:

    // 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

Aucune des réponses ci-dessus n'est un travail pour moi.

J'ai deux problèmes.

  1. Barre d'état noire
  2. couche transparente sur la barre de titre

enter image description here

Solution 

  1. Statut Black - J'enlève toute personnalisation de la barre de navigation

    // commenter sous la ligne dans AppDelegate

    [[UINavigationBar apparence] setBackgroundImage: [UIImage imageNamed: @ "nav_bg"] pourBarMetrics: UIBarMetricsDefault];

  2. Barre de titre transparente - set navigationBarHidden = Yes pour MFMailComposeViewController

    composeViewController.navigationBarHidden = YES;

1
Kirit Vaghela

Dans mon cas, j'utilisais "l'apparence de la barre d'état basée sur le contrôleur de vue" et présentais un contrôleur de vue modal avec une transition de séquence personnalisée et then présentant le MFMailComposeViewController à partir de là. Dans cette situation, par défaut, iOS respecte/utilise uniquement la méthode preferredStatusBarStyle de présentation ou "racine".

Donc, une fois que j'ai remplacé childViewControllerForStatusBarStyle dans mon contrôleur de vue racine etpreferredStatusBarStyle dans mon contrôleur de vue modale, tout a fonctionné comme prévu ... quelque chose comme ceci:

// 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 introduit une méthode prefersStatusBarHidden, mais ce ne sera pas si facile à utiliser dans ce cas. Vous préférerez peut-être utiliser la propriété statusBarHidden de UIApplication pendant que le modal est présenté.

0
Wain

Je suis en train de construire une application dans iOS8 et j'ai eu des problèmes avec la barre d'état avec toutes les fonctions natives telles que le composeur de courrier, l'appareil photo, etc.

Mettez ce qui suit dans votre fichier plist

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

Si vous utilisez la fonctionnalité d'ajout de ligne dans le storyboard, l'option UIViewControllerBasedStatusBarAppearance n'est pas une option. De plus, lors de l'ajout d'une ligne, il demande BOOLEN (OUI/NON). Ce ne peut pas être une chaîne NO dans le code source, ce doit être un faux booléen. Ouvrez plutôt la plist en tant que code source et ajoutez les lignes ci-dessus. Supprimez vos anciennes tentatives. Vous pourrez maintenant appliquer avec succès les extraits de code donnés dans de nombreuses réponses incomplètes trouvées sur le net.

Vous pouvez maintenant ajouter des modifications globales dans le fichier délégué de l'application et/ou des substitutions dans les contrôleurs eux-mêmes. Sans ce qui précède étant en place, tout le code de dépassement de pile que j'ai essayé a échoué lors de l'utilisation d'une fonction native. Maintenant tout fonctionne parfaitement.

Pour tester, remplacez tous les appels vers des appels "d'achèvement" à bord par

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