Hay varias formas de hacerlo, y creo que cada una podría encajar en un proyecto, pero no en otro, así que pensé que las mantendría aquí, tal vez alguien más se encargaría de un caso diferente.
1- Anular presente
Si tiene un BaseViewController
puede anular el present(_ viewControllerToPresent: animated flag: completion:)
método.
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 esta manera, no necesita hacer ningún cambio en ninguna present
llamada, ya que simplemente anulamos el present
método.
2- Una extensión:
extension UIViewController {
func presentInFullScreen(_ viewController: UIViewController,
animated: Bool,
completion: (() -> Void)? = nil) {
viewController.modalPresentationStyle = .fullScreen
present(viewController, animated: animated, completion: completion)
}
}
Uso:
presentInFullScreen(viewController, animated: true)
3- Para un controlador UIView
let viewController = UIViewController()
viewController.modalPresentationStyle = .fullScreen
present(viewController, animated: true, completion: nil)
4- del guión gráfico
Seleccione una secuencia y establezca la presentación en 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)
}
}
Uso:
En su AppDelegate
interior application(_ application: didFinishLaunchingWithOptions)
agregue esta línea:
UIViewController.swizzlePresent()
De esta manera, no necesita hacer ningún cambio en ninguna llamada actual, ya que estamos reemplazando la implementación del método actual en tiempo de ejecución.
Si necesita saber qué es swizzling, puede consultar este enlace:
https://nshipster.com/swift-objc-runtime/
fullScreen
opción debe ser predeterminada para evitar que se rompan los cambios de la interfaz de usuario.