Esistono diversi modi per farlo, e penso che ognuno potrebbe adattarsi a un progetto ma non a un altro, quindi ho pensato di tenerli qui, forse qualcun altro si imbatterà in un caso diverso.
1- Sostituisci presente
Se ne hai uno BaseViewController
puoi sovrascrivere il present(_ viewControllerToPresent: animated flag: completion:)
metodo.
class BaseViewController: UIViewController {
// ....
override func present(_ viewControllerToPresent: UIViewController,
animated flag: Bool,
completion: (() -> Void)? = nil) {
viewControllerToPresent.modalPresentationStyle = .fullScreen
super.present(viewControllerToPresent, animated: flag, completion: completion)
}
// ....
}
In questo modo non è necessario apportare alcuna modifica a nessuna present
chiamata, poiché abbiamo appena annullato il present
metodo.
2- Un'estensione:
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- Per un UIViewController
let viewController = UIViewController()
viewController.modalPresentationStyle = .fullScreen
present(viewController, animated: true, completion: nil)
4- Dallo storyboard
Seleziona un seguito e imposta la presentazione su 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:
Nel tuo AppDelegate
interno application(_ application: didFinishLaunchingWithOptions)
aggiungi questa riga:
UIViewController.swizzlePresent()
In questo modo non è necessario apportare alcuna modifica a nessuna chiamata presente, poiché stiamo sostituendo l'implementazione del metodo attuale in fase di esecuzione.
Se hai bisogno di sapere cosa gira, puoi controllare questo link:
https://nshipster.com/swift-objc-runtime/
fullScreen
opzione dovrebbe essere predefinita per evitare di interrompere le modifiche all'interfaccia utente.