Présentation du modal dans iOS 13 en plein écran


466

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?

comportement modal

Merci

Réponses:


622

Avec iOS 13, comme indiqué dans l' état des plates - formes de l'Union lors de la WWDC 2019, Apple a introduit une nouvelle présentation de carte par défaut. Pour forcer le plein écran, vous devez le spécifier explicitement avec:

let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen //or .overFullScreen for transparency
self.present(vc, animated: true, completion: nil)

81
Je dirais que cela ne restera pas longtemps par défaut. L' fullScreenoption doit être par défaut pour éviter de casser les modifications de l'interface utilisateur.
Jakub Truhlář

17
Je ne compterai pas là-dessus. Dans le passé, Apple a souvent modifié les paramètres par défaut en devenant actif uniquement lorsque vous établissez une liaison avec le SDK actuel. Nous espérons avoir l'ancien comportement lors de la liaison avec les versions précédentes.
DrMickeyLauer

11
Je peux confirmer que les applications intégrées à Xcode-10 exécutées sur le simulateur iOS 13 sont toujours par défaut en plein écran. Comme l'a dit @DrMickeyLauer, la construction avec Xcode 11 opte l'application pour le nouveau comportement. UtilisationisModalInPresentation pour empêcher le geste de balayage de se terminer. Voir mon article de blog pour plus de détails: medium.com/@hacknicity/…
Geoff Hackworth

5
Je recommande d'utiliser .fullScreen au lieu de .overFullScreen. .fullScreen déclenche viewWillAppear et viewDidAppear, .overFullScreen ne fait pas cela
PiterPan

5
Le temps a passé et le .automaticstyle est devenu le style par défaut, qui est (pour la plupart des contrôleurs de vue) le .pageSheetstyle. Cependant, certains contrôleurs de vue système peuvent le mapper à un style différent.
Jakub Truhlář

186

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 .

entrez la description de l'image ici


2
Existe-t-il un moyen dans Interface Builder de définir isModalInPresentation?
Brad Thomas

D'accord avec ça. Modifiez la valeur de présentation pour les vues incriminées de niveau le plus élevé.
David

C'est celui qui a fonctionné pour moi parce que je l'ai fait performSegue. Merci mon cher!
Blasanka

95

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:

fix_storyboard_presentation_default_behavior


2
Existe-t-il un moyen de le faire par programme pour toutes les vues au lieu d'un par le biais du storyboard?
The1993

@ The1993 Avez-vous trouvé une alternative à cela?
Shobhit Puri

1
@ShobhitPuri Jetez un œil à la première solution d'Omreyh ici stackoverflow.com/a/58255416/4323101
The1993

1
Wow, c'était LA réponse à mes problèmes. Merci pour le conseil! Pour tous ceux qui étudient également cela, c'est la solution pour un comportement étrange après la réouverture de l'application en arrière-plan. Dans mon application, l'ouverture à partir de l'arrière-plan superposerait mon écran de démarrage (contrôleur de vue initial) en tant que style de présentation de carte, puis toutes les séquences à partir de maintenant se fondraient au lieu d'utiliser mon style de séquence défini. Ce serait bien si je fermais l'application (appuyez deux fois sur le bouton d'accueil et glissez vers le haut, puis rouvrez), mais tout lancement supplémentaire entraînerait ce comportement étrange. Merci encore!
Justin

92

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, BaseViewControllervous pouvez remplacer la present(_ viewControllerToPresent: animated flag: completion:)méthode.

class BaseViewController: UIViewController {

  // ....

  override func present(_ viewControllerToPresent: UIViewController,
                        animated flag: Bool,
                        completion: (() -> Void)? = nil) {
    viewControllerToPresent.modalPresentationStyle = .fullScreen
    super.present(viewControllerToPresent, animated: flag, completion: completion)
  }

  // ....
}

De cette façon, vous n'avez pas besoin de faire de changement sur aucun presentappel, car nous avons simplement dépassé lepresent méthode.

2- Une extension:

extension UIViewController {
  func presentInFullScreen(_ viewController: UIViewController,
                           animated: Bool,
                           completion: (() -> Void)? = nil) {
    viewController.modalPresentationStyle = .fullScreen
    present(viewController, animated: animated, completion: completion)
  }
}

Usage:

presentInFullScreen(viewController, animated: true)

3- Pour un UIViewController

let viewController = UIViewController()
viewController.modalPresentationStyle = .fullScreen
present(viewController, animated: true, completion: nil)

4- Du Storyboard

Sélectionnez une séquence et définissez la présentation sur FullScreen.
entrez la description de l'image ici

5- Swizzling

extension UIViewController {

  static func swizzlePresent() {

    let orginalSelector = #selector(present(_: animated: completion:))
    let swizzledSelector = #selector(swizzledPresent)

    guard let orginalMethod = class_getInstanceMethod(self, orginalSelector), let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) else{return}

    let didAddMethod = class_addMethod(self,
                                       orginalSelector,
                                       method_getImplementation(swizzledMethod),
                                       method_getTypeEncoding(swizzledMethod))

    if didAddMethod {
      class_replaceMethod(self,
                          swizzledSelector,
                          method_getImplementation(orginalMethod),
                          method_getTypeEncoding(orginalMethod))
    } else {
      method_exchangeImplementations(orginalMethod, swizzledMethod)
    }

  }

  @objc
  private func swizzledPresent(_ viewControllerToPresent: UIViewController,
                               animated flag: Bool,
                               completion: (() -> Void)? = nil) {
    if #available(iOS 13.0, *) {
      if viewControllerToPresent.modalPresentationStyle == .automatic {
        viewControllerToPresent.modalPresentationStyle = .fullScreen
      }
    }
    swizzledPresent(viewControllerToPresent, animated: flag, completion: completion)
   }
}

Utilisation:
Dans votre AppDelegateintérieur, application(_ application: didFinishLaunchingWithOptions)ajoutez cette ligne:

UIViewController.swizzlePresent()

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/


J'ai beaucoup de viewControllers dans mon projet, mais je n'ai pas de classe de base, je ne veux pas faire de swizzling, avez-vous une solution pour cela avec des changements de code minimum
gourou

J'ai utilisé swizzling, mais j'ai ajouté .pageSheet pour conditionner .... si viewControllerToPresent.modalPresentationStyle == .pageSheet || viewControllerToPresent.modalPresentationStyle == .automatic {viewControllerToPresent.modalPresentationStyle = .fullScreen}
Crash

la barre d'état se cache lorsque j'ajoute la solution appliquée no 1.
Ganesh Pawar

4
Swizzling est une solution qui a très bien fonctionné pendant un certain temps. Cependant, lorsque j'utilise certains sdks externes tels que FacebookLogin (5.8 à partir d'aujourd'hui) et GoogleSignin, j'ai remarqué que cette méthode rompt ces flux: nous obtenons un écran blanc sur iPad. Cela est probablement dû au fait qu'ils utilisent leur propre méthode de swizzling
Tao-Nhan Nguyen

39

J'ai utilisé swizzling pour ios 13

import Foundation
import UIKit

private func _swizzling(forClass: AnyClass, originalSelector: Selector, swizzledSelector: Selector) {
    if let originalMethod = class_getInstanceMethod(forClass, originalSelector),
       let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) {
        method_exchangeImplementations(originalMethod, swizzledMethod)
    }
}

extension UIViewController {

    static let preventPageSheetPresentation: Void = {
        if #available(iOS 13, *) {
            _swizzling(forClass: UIViewController.self,
                       originalSelector: #selector(present(_: animated: completion:)),
                       swizzledSelector: #selector(_swizzledPresent(_: animated: completion:)))
        }
    }()

    @available(iOS 13.0, *)
    @objc private func _swizzledPresent(_ viewControllerToPresent: UIViewController,
                                        animated flag: Bool,
                                        completion: (() -> Void)? = nil) {
        if viewControllerToPresent.modalPresentationStyle == .pageSheet
                   || viewControllerToPresent.modalPresentationStyle == .automatic {
            viewControllerToPresent.modalPresentationStyle = .fullScreen
        }
        _swizzledPresent(viewControllerToPresent, animated: flag, completion: completion)
    }
}

puis mettez ça

UIViewController.preventPageSheetPresentation

quelque part

par exemple dans AppDelegate

func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]?) -> Bool {

    UIViewController.preventPageSheetPresentation
    // ...
    return true
}

3
Solution la plus simple si vous avez plusieurs modaux.
Raisal Calicut

quelque part signifie, signifie dans quel fichier ou où dans tout le projet
Yatendra

quelque part vous, je l'ai mis dans appdelegate static letest 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 fois
Maxime Ashurov

37

Pour les utilisateurs d'Objective-C

Utilisez simplement ce code

 [vc setModalPresentationStyle: UIModalPresentationFullScreen];

Ou si vous souhaitez l'ajouter en particulier dans iOS 13.0, utilisez

 if (@available(iOS 13.0, *)) {
     [vc setModalPresentationStyle: UIModalPresentationFullScreen];
 } else {
     // Fallback on earlier versions
 }

2
cela fonctionne également sur la version antérieure d'ios, mais la réponse est bonne
Catalin

4
UIModalPresentationFullScreen fonctionne avec iOS 3.2+. Donc pas besoin d'ajouter la condition if else.
flame3

2
Pour une raison quelconque dans iOS 13.1.2 uniquement dans les classes Obj-c, cela ne fonctionne pas et modalPresentationStyle n'affiche qu'une pageSheet. Est-ce que cela se produit pour quelqu'un d'autre?
Sevy11

@ Sevy11 Je n'ai pas mis à jour vers iOS 13.1.2 mais fonctionne bien à 13.1
9to5ios

salut @ Sevy11 J'ai mis à jour mon iOS 13.1.2 et son bon fonctionnement, veuillez vérifier de votre côté
9to5ios

37

Bon mot:

modalPresentationStyledoit être défini sur le navigationController qui est présenté .


iOS 13 et versions ultérieures iOS fullScreen avec overCurrentContextet navigationController

Code testé

let controller = UIViewController()
let navigationController = UINavigationController(rootViewController: controller)
navigationController.modalPresentationStyle = .overCurrentContext
self.navigationController?.present(navigationController, animated: true, completion: nil)

modalPresentationStyle nécessite de définir à navigationController .


Une clarification: la présentation d'un viewController à partir d'un navigationController n'a pas besoin que modalPresentationStyle soit défini sur le navigationController. Au lieu de cela, il est défini sur le viewController présenté. Cependant, si vous présentez un navigationController, la propriété 'modalPresentationStyle' doit être définie sur le navigationController, pas sur le viewController intégré. Cette approche fonctionne sous iOS 13.3, Xcode 11.3. Voir la réponse de Yogesh Bharate.
Womble

@Pratik Sodha. Une aide à ce sujet? stackoverflow.com/questions/61429600/…
david


25

À titre indicatif: si vous appelez present à un ViewControllerqui est intégré dans un, NavigationControllervous devez définir le NavigationControllerto .fullScreenet non le VC.

Vous pouvez le faire comme @davidbates ou vous le faites par programme (comme @pascalbros).

Un exemple de scénario:

entrez la description de l'image ici

    //BaseNavigationController: UINavigationController {}
    let baseNavigationController = storyboard!.instantiateViewController(withIdentifier: "BaseNavigationController")
    var navigationController = UINavigationController(rootViewController: baseNavigationController)
    navigationController.modalPresentationStyle = .fullScreen
    navigationController.topViewController as? LoginViewController
    self.present(navigationViewController, animated: true, completion: nil)

22

Je devais faire les deux:

  1. Définir le style de présentation en plein écran

    Plein écran

  2. Définir la barre supérieure comme barre de navigation translucide

Barre du haut


C'est une hypothèse très étrange qu'une option dans les mesures
simulées

14

Changer modalPresentationStyleavant de présenter

vc.modalPresentationStyle = UIModalPresentationFullScreen;

13

Voici une solution simple sans coder une seule ligne.

  • Sélectionnez Afficher le contrôleur dans le Storyboard
  • Sélectionner un inspecteur d'attributs
  • Réglez la présentation "Automatique" sur "Plein écran" comme sur l'image ci-dessous

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.

entrez la description de l'image ici


Je pense que ce qui est essentiel ici, c'est que vous l'avez fait sur le NavigationController, ce que montre l'image, mais le texte ne le dit pas de cette façon.
Andy Weinstein

1
assurez-vous également que les séquences suivantes sont "Show" et non "Present Modally"
Andy Weinstein

Ok, donc celui-ci semble fonctionner pour moi lorsque j'utilise un contrôleur de barre d'onglets pour contrôler d'autres vues. Cependant, vous devez définir la présentation du «contrôleur de barre d'onglets» en plein écran, car cela contrôle toutes les autres vues.
Charlie

12

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

entrez la description de l'image ici


12

Voici la solution pour Objective-C

UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *vc = [storyBoard instantiateViewControllerWithIdentifier:@"ViewController"];

vc.modalPresentationStyle = UIModalPresentationFullScreen;

[self presentViewController:vc animated:YES completion:nil];

11

Dernière version pour iOS 13 et Swift 5.x

let vc = ViewController(nibName: "ViewController", bundle: nil)

vc.modalPresentationStyle = .fullScreen

self.present(vc, animated: true, completion: nil)

9

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.

#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

avez-vous le fichier .h?
Pedro Góes

@ PedroGóes oui, mais il ne s'agit que d'une déclaration de catégorie: `` `` @interface UIViewController (Presentation) @end '' ''
Alexander Kulabukhov

Utilisez-le si vous ne voulez pas gérer tous les contrôleurs de votre storyboard! Gain de temps, merci!
AnthoPak Il y a

7

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.

entrez la description de l'image ici

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

Le format suivant n'est pas adapté aux pages plein écran:

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

Le format suivant convient aux pages plein écran:

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

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

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

Remplacer Regex

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

4

Initialement, la valeur par défaut est fullscreenpour modalPresentationStyle, mais dans iOS 13 ses modifications dans UIModalPresentationStyle.automatic.

Si vous souhaitez créer le contrôleur de vue plein écran, vous devez changer le modalPresentationStyleen fullScreen.

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é.


C'est la bonne réponse à partir d'iOS 13.3, Xcode 11.3, pour les situations où vous souhaitez présenter un viewController à partir d'un navigationController. Un modalPresentationStyle de .overFullScreen fonctionne également. Cependant, si vous présentez un navigationController, vous devez définir 'modalPresentationStyle' sur le navigationController, pas sur le viewController. À votre santé.
Womble

3

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"


2
let Obj = MtViewController()
Obj.modalPresentationStyle = .overFullScreen
self.present(Obj, animated: true, completion: nil)

// si vous souhaitez désactiver le glissement pour le supprimer, ajoutez une ligne

Obj.isModalInPresentation = true

Consultez le document Apple pour plus d'informations.


2

Je l'ai atteint en utilisant la méthode swizzling (Swift 4.2):

Pour créer une extension UIViewController comme suit

extension UIViewController {

    @objc private func swizzled_presentstyle(_ viewControllerToPresent: UIViewController, animated: Bool, completion: (() -> Void)?) {

        if #available(iOS 13.0, *) {
            if viewControllerToPresent.modalPresentationStyle == .automatic || viewControllerToPresent.modalPresentationStyle == .pageSheet {
                viewControllerToPresent.modalPresentationStyle = .fullScreen
            }
        }

        self.swizzled_presentstyle(viewControllerToPresent, animated: animated, completion: completion)
    }

     static func setPresentationStyle_fullScreen() {

        let instance: UIViewController = UIViewController()
        let aClass: AnyClass! = object_getClass(instance)

        let originalSelector = #selector(UIViewController.present(_:animated:completion:))
        let swizzledSelector = #selector(UIViewController.swizzled_presentstyle(_:animated:completion:))

        let originalMethod = class_getInstanceMethod(aClass, originalSelector)
        let swizzledMethod = class_getInstanceMethod(aClass, swizzledSelector)
        if let originalMethod = originalMethod, let swizzledMethod = swizzledMethod {
        method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

et dans AppDelegate, dans l'application: didFinishLaunchingWithOptions: invoquez le code swizzling en appelant:

UIViewController.setPresentationStyle_fullScreen()

1

Cela a fonctionné pour moi:

yourViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen


3
Cela n'ajoute rien à toutes les autres réponses existantes.
rmaddy

1

Créez une catégorie pour UIViewController (par exemple UIViewController + PresentationStyle). Ajoutez-y le code suivant.

 -(UIModalPresentationStyle)modalPresentationStyle{
     return UIModalPresentationStyleFullScreen;
}

cela cassera UISearchController + déclenchera un crash difficile à déboguer
dklt

@dklt C'est une excellente observation. Ainsi, la définition explicite de la propriété résoudra le problème. Pas de solutions plus simples si UISearchController utilise.
Govind

0

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:

class MyBaseViewController: UIViewController {

//MARK: Initialisers

/// Alternative initializer which allows you to set the modal presentation syle
/// - Parameter modalStyle: the presentation style to be used
init(with modalStyle:UIModalPresentationStyle) {
    super.init(nibName: nil, bundle: nil)
    self.setup(modalStyle: modalStyle)
}

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    // default modal presentation style as fullscreen
    self.setup(modalStyle: .fullScreen)
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
    // default modal presentation style as fullscreen
    self.setup(modalStyle: .fullScreen)
}

//MARK: Private

/// Setup the view
///
/// - Parameter modalStyle: indicates which modal presentation style to be used
/// - Parameter modalPresentation: default true, it prevent modally presented view to be dismissible with the default swipe gesture
private func setup(modalStyle:UIModalPresentationStyle, modalPresentation:Bool = true){
    if #available(iOS 13, *) {
        self.modalPresentationStyle = modalStyle
        self.isModalInPresentation = modalPresentation
    }
}

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


0

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 :-)

videoController.modalPresentationStyle = UIModalPresentationFullScreen;

2
Cela n'ajoute rien à toutes les autres réponses existantes.
rmaddy

0

La solution la plus simple qui a fonctionné pour moi.

viewController.modalPresentationStyle = .fullScreen

3
Cela n'ajoute rien à toutes les autres réponses existantes.
rmaddy

0

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.

let vc = UIViewController()
let navController = UINavigationController(rootViewController: vc)
navController.modalPresentationStyle = .fullScreen

0
class MyViewController: UIViewController {

    convenience init() {
        self.init(nibName:nil, bundle:nil)
        self.modalPresentationStyle = .fullScreen
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

Plutôt que d'appeler self.modalPresentationStyle = .fullScreenpour chaque contrôleur de vue, vous pouvez sous-classer UIViewController et simplement l'utiliser MyViewControllerpartout.


-1

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 ()

//#1
extension UIViewController {

//#2
func presentLocal(_ viewControllerToPresent: UIViewController, animated flag: 
Bool, completion: (() -> Void)? = nil) {

//Reusing below 2 lines :-)
viewControllerToPresent.modalPresentationStyle = .overCurrentContext
self.present(viewControllerToPresent, animated: flag, completion: completion)

  }
}

Appel comme ci-dessous

let vc = MyViewController()
let nc = UINavigationController(rootViewController: vc)
sourceView.presentLocal(nc, animated: true, completion: nil)

OU

let vc = MyViewController()
sourceView.presentLocal(vc, animated: true, completion: nil)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.