Il y a de multiples façons de faire cela, et je pense que chacune d'entre elles pourrait convenir à un projet mais pas à un autre, alors j'ai pensé les garder ici, peut-être que quelqu'un d'autre tombera sur un cas différent.
1- Annulation présente
Si vous avez un BaseViewController
vous pouvez remplacer le 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)
}
// ....
}
En utilisant cette méthode, vous n'avez pas besoin d'effectuer de changement sur aucun des éléments suivants present
car nous venons d'annuler l'appel present
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)
}
}
Utilisation :
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 un enchaînement et réglez la présentation sur FullScreen
.
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 AppDelegate
à l'intérieur de application(_ application: didFinishLaunchingWithOptions)
ajouter cette ligne :
UIViewController.swizzlePresent()
En utilisant cette méthode, vous n'avez pas besoin de modifier les appels actuels, car nous remplaçons l'implémentation de la méthode actuelle en cours d'exécution.
Si vous voulez savoir ce qu'est le swizzling, vous pouvez consulter ce lien : https://nshipster.com/swift-objc-runtime/