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];
}
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.
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
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
}
}
Quel a été le truc pour moi?
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];
}
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:
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
}
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
}
}
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
}
}
Aucune des réponses ci-dessus n'est un travail pour moi.
J'ai deux problèmes.
Solution
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];
Barre de titre transparente - set navigationBarHidden = Yes pour MFMailComposeViewController
composeViewController.navigationBarHidden = YES;
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;
}
[self presentViewController:mailViewController animated:YES completion:^(void) { [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; }];
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é.
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];}