Dans iOS 13, il existe un nouveau comportement pour le contrôleur de vue modale lors de sa présentation.
Maintenant, ce n'est pas plein écran par défaut et lorsque j'essaie de glisser vers le bas, l'application ferme simplement le contrôleur de vue automatiquement.
Comment puis-je empêcher ce comportement et revenir à l'ancien vc modal plein écran?
Merci
ios
viewcontroller
modalviewcontroller
ios13
pascalbros
la source
la source
fullScreen
option doit être par défaut pour éviter de casser les modifications de l'interface utilisateur.isModalInPresentation
pour empêcher le geste de balayage de se terminer. Voir mon article de blog pour plus de détails: medium.com/@hacknicity/….automatic
style est devenu le style par défaut, qui est (pour la plupart des contrôleurs de vue) le.pageSheet
style. Cependant, certains contrôleurs de vue système peuvent le mapper à un style différent.J'ajoute une information qui pourrait être utile à quelqu'un. Si vous avez une séquence de storyboard, pour revenir à l'ancien style, vous devez définir la propriété kind sur Present Modally et la propriété Presentation sur Full Screen .
la source
performSegue
. Merci mon cher!J'ai eu ce problème sur la vue initiale juste après l'écran de lancement. Le correctif pour moi puisque je n'avais pas de séquence ou de logique définie était de basculer la présentation de l'automatique au plein écran comme indiqué ici:
la source
Il y a plusieurs façons de le faire, et je pense que chacun pourrait convenir à un projet mais pas à un autre, alors j'ai pensé que je les garderais ici, peut-être que quelqu'un d'autre ira dans un cas différent.
1- Priorité présente
Si vous en avez un,
BaseViewController
vous pouvez remplacer lapresent(_ viewControllerToPresent: animated flag: completion:)
méthode.De cette façon, vous n'avez pas besoin de faire de changement sur aucun
present
appel, car nous avons simplement dépassé lepresent
méthode.2- Une extension:
Usage:
3- Pour un UIViewController
4- Du Storyboard
Sélectionnez une séquence et définissez la présentation sur
FullScreen
.5- Swizzling
Utilisation:
Dans votre
AppDelegate
intérieur,application(_ application: didFinishLaunchingWithOptions)
ajoutez cette ligne:De cette façon, vous n'avez pas besoin de faire de changement sur un appel en cours, car nous remplaçons l'implémentation de la méthode actuelle dans le runtime.
Si vous avez besoin de savoir ce qui se passe, vous pouvez consulter ce lien: https://nshipster.com/swift-objc-runtime/
la source
J'ai utilisé swizzling pour ios 13
puis mettez ça
quelque part
par exemple dans AppDelegate
la source
static let
est paresseux, vous devez le lire pour qu'il soit calculé, var paresseux calculé une seule fois, je l'utilise pour avoir la garantie que swizzling appelé une foisPour les utilisateurs d'Objective-C
Utilisez simplement ce code
Ou si vous souhaitez l'ajouter en particulier dans iOS 13.0, utilisez
la source
Bon mot:
modalPresentationStyle
doit être défini sur le navigationController qui est présenté .Code testé
modalPresentationStyle nécessite de définir à navigationController .
la source
À titre indicatif: si vous appelez present à un
ViewController
qui est intégré dans un,NavigationController
vous devez définir leNavigationController
to.fullScreen
et non le VC.Vous pouvez le faire comme @davidbates ou vous le faites par programme (comme @pascalbros).
Un exemple de scénario:
la source
Je devais faire les deux:
Définir le style de présentation en plein écran
Définir la barre supérieure comme barre de navigation translucide
la source
Changer
modalPresentationStyle
avant de présenterla source
Voici une solution simple sans coder une seule ligne.
Cette modification rend le comportement de l'application iPad comme prévu, sinon le nouvel écran s'affiche au centre de l'écran sous forme de popup.
la source
Si vous avez un UITabController avec des écrans avec des contrôleurs de navigation intégrés, vous devez définir la présentation UITabController sur FullScreen comme indiqué dans l'image ci-dessous
la source
Voici la solution pour Objective-C
la source
Dernière version pour iOS 13 et Swift 5.x
la source
Voici ma version de correctif dans ObjectiveC en utilisant les catégories. Avec cette approche, vous aurez le comportement UIModalPresentationStyleFullScreen par défaut jusqu'à ce qu'un autre soit défini explicitement.
la source
Toutes les autres réponses sont suffisantes, mais pour un grand projet comme le nôtre et où les navigations sont effectuées à la fois dans le code et le storyboard, c'est une tâche assez intimidante.
Pour ceux qui utilisent activement Storyboard. Voici mon conseil: utilisez Regex.
Le format suivant n'est pas adapté aux pages plein écran:
Le format suivant convient aux pages plein écran:
Le regex suivant compatible avec VS CODE convertira toutes les pages de l'ancien style en nouvelles pages de style. Vous devrez peut-être échapper des caractères spéciaux si vous utilisez d'autres moteurs / éditeurs de texte regex.
Rechercher Regex
Remplacer Regex
la source
Initialement, la valeur par défaut est
fullscreen
pour modalPresentationStyle, mais dans iOS 13 ses modifications dansUIModalPresentationStyle.automatic
.Si vous souhaitez créer le contrôleur de vue plein écran, vous devez changer le
modalPresentationStyle
enfullScreen
.Reportez-vous à
UIModalPresentationStyle
la documentation Apple pour plus de détails et reportez-vous aux directives de l'interface humaine Apple pour savoir où utiliser quelle modalité.la source
Vous pouvez facilement le faire Ouvrez votre storyboard en tant que code source et recherchez
kind="presentation"
, dans toutes les balises seague avec kind = presentation ajoutez un attribut supplémentairemodalPresentationStyle="fullScreen"
la source
// si vous souhaitez désactiver le glissement pour le supprimer, ajoutez une ligne
Consultez le document Apple pour plus d'informations.
la source
Je l'ai atteint en utilisant la méthode swizzling (Swift 4.2):
Pour créer une extension UIViewController comme suit
et dans AppDelegate, dans l'application: didFinishLaunchingWithOptions: invoquez le code swizzling en appelant:
la source
Cela a fonctionné pour moi:
yourViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen
la source
Créez une catégorie pour UIViewController (par exemple UIViewController + PresentationStyle). Ajoutez-y le code suivant.
la source
une autre approche consiste à avoir votre propre composant de base viewcontroller dans votre application, et à simplement implémenter les initialiseurs désignés et requis avec une configuration de base, quelque chose comme ceci:
REMARQUE : si votre contrôleur de vue est contenu dans un contrôleur de navigation qui est en fait présenté de façon modale, le contrôleur de navigation doit alors aborder le problème de la même manière (ce qui signifie que le composant de votre contrôleur de navigation personnalisé est personnalisé de la même manière).
Testé sur Xcode 11.1 sur iOS 13.1 et iOS 12.4
J'espère que cela aide
la source
J'ai eu ce problème avec une vidéo ne présentant plus le plein écran. Ajout de cette ligne, qui a sauvé la journée :-)
la source
La solution la plus simple qui a fonctionné pour moi.
la source
Si vous utilisez un UINavigationController et intégrez un ViewController en tant que contrôleur de vue racine, vous vous poserez également le même problème. Utilisez le code suivant pour surmonter.
la source
Plutôt que d'appeler
self.modalPresentationStyle = .fullScreen
pour chaque contrôleur de vue, vous pouvez sous-classer UIViewController et simplement l'utiliserMyViewController
partout.la source
Les réponses et suggestions ci-dessus sont exactes, voici une autre version et une manière efficace d'utiliser par programmation.
# 1 a créé une extension UIView
# 2 a créé une méthode ()
Appel comme ci-dessous
OU
la source