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 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 present
appel, 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
.
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
inté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/
fullScreen
option doit être par défaut pour éviter de casser les modifications de l'interface utilisateur.