649 votes

Présentation de la modale en plein écran sous iOS 13

Dans iOS 13, il y a un nouveau comportement pour le contrôleur de vue modal lorsqu'il est présenté.

Maintenant, il n'y a pas de plein écran par défaut et lorsque j'essaie de glisser vers le bas, l'application rejette automatiquement le contrôleur de vue.

Comment puis-je empêcher ce comportement et revenir à l'ancien vc modal plein écran ?

modal behaviour

Gracias

10voto

skornos Points 168

Réglage de navigationController.modalPresentationStyle à .fullScreen a été répété ici plus de mille fois mais laissez-moi vous présenter un autre bloqueur qui causait cette UIViewController / UINavigationController n'apparaissait pas dans fullscreen même si toutes les propriétés ont été définies correctement.

Dans mon cas, le coupable était caché dans cette ligne

navigationController?.presentationController?.delegate = self

Apparemment, lors du réglage UIAdaptivePresentationControllerDelegate vous devez spécifier le style de présentation dans la méthode de délégué facultative

    public func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        presentationStyle
    }

9voto

Voici ma version de la correction en ObjectiveC en utilisant les catégories. Avec cette approche, vous aurez le comportement par défaut de UIModalPresentationStyleFullScreen jusqu'à ce qu'un autre comportement soit explicitement défini.

#import "UIViewController+Presentation.h"
#import "objc/runtime.h"

@implementation UIViewController (Presentation)

- (void)setModalPresentationStyle:(UIModalPresentationStyle)modalPresentationStyle {
    [self setPrivateModalPresentationStyle:modalPresentationStyle];
}

-(UIModalPresentationStyle)modalPresentationStyle {
    UIModalPresentationStyle style = [self privateModalPresentationStyle];
    if (style == NSNotFound) {
        return UIModalPresentationFullScreen;
    }
    return style;
}

- (void)setPrivateModalPresentationStyle:(UIModalPresentationStyle)modalPresentationStyle {
    NSNumber *styleNumber = [NSNumber numberWithInteger:modalPresentationStyle];
     objc_setAssociatedObject(self, @selector(privateModalPresentationStyle), styleNumber, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (UIModalPresentationStyle)privateModalPresentationStyle {
    NSNumber *styleNumber = objc_getAssociatedObject(self, @selector(privateModalPresentationStyle));
    if (styleNumber == nil) {
        return NSNotFound;
    }
    return styleNumber.integerValue;
}

@end

8voto

Bangonkali Points 11

Toutes les autres réponses sont suffisantes mais pour un grand projet comme le nôtre et où les navigations se font à la fois dans le code et le storyboard, c'est une tâche assez ardue.

enter image description here

Pour ceux qui utilisent activement Storyboard. Voici mon conseil : utilisez Regex.

Le format suivant ne convient pas aux pages en plein écran :

<segue destination="Bof-iQ-svK" kind="presentation" identifier="importSystem" modalPresentationStyle="fullScreen" id="bfy-FP-mlc"/>

Le format suivant est bon pour les pages en plein écran :

<segue destination="7DQ-Kj-yFD" kind="presentation" identifier="defaultLandingToSystemInfo" modalPresentationStyle="fullScreen" id="Mjn-t2-yxe"/>

La regex suivante, compatible avec VS CODE, convertira toutes les pages de l'ancien style en pages du nouveau style. Vous devrez peut-être échapper les caractères spéciaux si vous utilisez d'autres moteurs d'expressions rationnelles/éditeurs de texte.

Recherche Regex

<segue destination="(.*)"\s* kind="show" identifier="(.*)" id="(.*)"/>

Remplacer le Regex

<segue destination="$1" kind="presentation" identifier="$2" modalPresentationStyle="fullScreen" id="$3"/>

5voto

Yogesh Bharate Points 507

Initialement, la valeur par défaut est fullscreen pour modalPresentationStyle, mais en iOS 13 ses modifications à la UIModalPresentationStyle.automatic .

Si vous voulez faire le contrôleur de la vue plein écran, vous devez modifier le fichier modalPresentationStyle à fullScreen .

Voir UIModalPresentationStyle documentation sur la pomme pour plus de détails et se référer à directives relatives à l'interface humaine d'apple pour savoir où utiliser telle ou telle modalité.

3voto

Mohit tomar Points 325
let Obj = MtViewController()
Obj.modalPresentationStyle = .overFullScreen
self.present(Obj, animated: true, completion: nil)

// si vous voulez désactiver le "swipe to dismiss", ajoutez la ligne suivante

Obj.isModalInPresentation = true

Vérifiez Document Apple pour plus d'informations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X