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

48voto

iphonemaclover Points 1096

Pour les utilisateurs d'Objective-C

Utilisez simplement ce code

 [vc setModalPresentationStyle: UIModalPresentationFullScreen];

Ou si vous voulez l'ajouter en particulier dans iOS 13.0 alors utilisez

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

5 votes

UIModalPresentationFullScreen fonctionne avec iOS 3.2+. Il n'est donc pas nécessaire d'ajouter une condition if else.

2 votes

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

0 votes

@Sevy11 Je n'ai pas mis à jour vers iOS 13.1.2 mais je fonctionne bien sous 13.1.

46voto

Pratik Sodha Points 1525

One Liner :

modalPresentationStyle doit être défini sur le contrôleur de navigation qui est présenté .


iOS 13 et version inférieure d'iOS plein écran avec overCurrentContext y navigationController

Code testé

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

modalPresentationStyle à fixer à contrôleur de navigation .

42voto

Garry Points 218

Cela a fonctionné pour moi

let vc = self.storyboard?.instantiateViewController(withIdentifier: "storyboardID_cameraview1") as! CameraViewController

vc.modalPresentationStyle = .fullScreen

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

41voto

Maxime Ashurov Points 21

J'ai utilisé le 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)
    }
}

alors mettez ceci

UIViewController.preventPageSheetPresentation

quelque part

par exemple dans AppDelegate

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

    UIViewController.preventPageSheetPresentation
    // ...
    return true
}

29voto

mumu Points 1198

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)

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