3

J'ai un UIPresentationController personnalisé et remplace frameOfPresentedViewInContainerView pour une présentation de viewController personnalisée. Tout fonctionne bien, sauf pour la barre d'état.Comment utiliser modalPresentationCapturesStatusBarAppearance = NO avec un UIPresentationController personnalisé?

Je ne veux pas que la barre d'état change l'apparence du tout - elle devrait juste rester telle quelle. Maintenant, la documentation d'Apple: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instp/UIViewController/modalPresentationCapturesStatusBarAppearance dit si modalPresentationStyle n'est pas UIModalPresentationFullScreen OU modalPresentationCapturesStatusBarAppearance est NON, je devrais être bien et la barre d'état ne devrait pas changer.

Avec ce code:

- (BOOL)prefersStatusBarHidden { 
    NSLog(
     @"prefersStatusBarHidden was called %d %ld", 
     self.modalPresentationCapturesStatusBarAppearance, 
     (long)self.modalPresentationStyle 
    ); 

    return YES; 
} 

Je vois que prefersStatusBarHidden est appelée, même si modalPresentationCapturesStatusBarAppearance est NO (affiche que 0) et modalPresentationStyle est UIModalPresentationCustom (affiche comme 4).

De toute évidence, c'est la raison pour laquelle la barre d'état change lors de la présentation de viewController.

Mais pourquoi?

Ma pensée sur ceci est que iOS pense que le viewController est présenté en plein écran même si ce n'est pas le cas.

J'ai découvert la propriété de UIPresentationController, shouldPresentInFullscreen - elle renvoie YES par défaut. Renvoyer NO n'aide pas du tout, donc je ne comprends pas ce que cette propriété fait même ... Il n'a littéralement aucun effet. La même chose s'applique à la propriété presentationStyle - Je ne vois aucun effet lors de la modification. Je m'attendais à ce que la propriété presentationStyle soit "redirigée" vers la propriété viewControllers modalPresentationStyle, mais cela reste à UIModalPresentationCustom, ce qui doit être le cas pour initier la présentation personnalisée en premier lieu. Donc, mes questions sont: Est-ce que quelqu'un sait comment garder la barre d'état comme il est avec un UIPresentationController personnalisé - et quelqu'un peut-il expliquer les propriétés shouldPresentInFullscreen et presentationStyle?

Merci! :)

+1

Avez-vous déjà trié tout cela? J'essaye également d'obtenir un UIPresentationController pour ne pas présenter le plein écran (en fait je veux être capable d'interagir avec certains éléments d'affichage sous-jacents - comme une barre d'onglets). Je ne peux pas comprendre comment l'obtenir pour me donner un PresentViewController qui n'est pas le contrôleur de vue racine de la fenêtre. –

+0

Non, malheureusement, je n'ai jamais compris :( –

+0

Il semble que cela a été résolu dans iOS 10. J'ai trouvé une solution hackish pour iOS 9 ici: https: // stackoverflow.com/questions/34819013/presentation-a-view-controller-without-change-the-status-bar-color-like-uialert/34819014 # 34819014 –

Répondre

0

Essayez d'implémenter childViewControllerForStatusBarStyle: et renvoyez-en zéro dans la classe en appelant votre UIPresentationController, généralement un UINavigationController.

C'est ce que je fais dans Swift quand je ne veux pas un enfant VC interférer avec mon choix à bon escient la barre d'état Style:

override func childViewControllerForStatusBarStyle() -> UIViewController? { 
    return nil // ignore childs and let this Navigation Controller handle the StatusBar style 
} 

override func preferredStatusBarStyle() -> UIStatusBarStyle { 
    return .LightContent // or .Default depending on your Style 
} 

Cela nécessite iOS8 et plus récent et est utilisable uniquement si vous définissez la clé UIViewControllerBasedStatusBarAppearance dans votre Info.plist à YES.

Bonus: Si cela n'aide pas l'appelant, utilisez-le dans le Ccontroller indiqué. J'ai vérifié mes projets, dans l'un d'eux c'est aussi dans le NavigationController montré comme PopOver et fonctionnant bien à partir d'aujourd'hui.

+0

Cela ne répond pas vraiment à la question, je veux dire, en général vous ' d veulent qu'un UIPresentationController soit réutilisable, sans nécessiter l'implémentation de quelque chose dans tous ses contrôleurs de vue présentés. Et implémenter quoi que ce soit dans le contrôleur de vue de présentation au lieu du présenté ne fait rien, c'est ce que la question était ... Mais oui, vous avez raison sur le "Bonus", c'est actuellement la seule façon de le faire. –

+0

@TedBuckland Vous avez raison, désolé que cela n'a pas vraiment répondu à votre question pourquoi cela se produit du tout. Pour être honnête: je ne peux pas répondre à cette partie de la question, montrez simplement comment je peux contourner le problème. La gestion de la barre d'état avec iOS est évidemment incorrecte dans certaines situations. Cela ne devrait pas être nécessaire, probablement préférable d'ouvrir un ticket radar. J'ai un post sur SO à propos de ce problème concernant UIActivityViewController, unfixable à partir de maintenant: http://stackoverflow.com/questions/35874582/set-statusbar-color-for-extensions-in-uiactivityviewcontroller. –