Es gibt mehrere Möglichkeiten, dies zu tun, und ich denke, jede könnte für ein Projekt passen, aber nicht für ein anderes. Deshalb dachte ich, ich werde sie hier behalten, vielleicht läuft jemand anderes zu einem anderen Fall.
1- Vorhanden überschreiben
Wenn Sie eine haben BaseViewController
, können Sie die present(_ viewControllerToPresent: animated flag: completion:)
Methode überschreiben .
class BaseViewController: UIViewController {
// ....
override func present(_ viewControllerToPresent: UIViewController,
animated flag: Bool,
completion: (() -> Void)? = nil) {
viewControllerToPresent.modalPresentationStyle = .fullScreen
super.present(viewControllerToPresent, animated: flag, completion: completion)
}
// ....
}
Auf diese Weise müssen Sie bei keinem present
Aufruf Änderungen vornehmen, da wir die present
Methode einfach überschrieben haben .
2- Eine Erweiterung:
extension UIViewController {
func presentInFullScreen(_ viewController: UIViewController,
animated: Bool,
completion: (() -> Void)? = nil) {
viewController.modalPresentationStyle = .fullScreen
present(viewController, animated: animated, completion: completion)
}
}
Verwendungszweck:
presentInFullScreen(viewController, animated: true)
3- Für einen UIViewController
let viewController = UIViewController()
viewController.modalPresentationStyle = .fullScreen
present(viewController, animated: true, completion: nil)
4- Vom Storyboard
Wählen Sie einen Abschnitt aus und stellen Sie die Präsentation auf ein 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)
}
}
Verwendung: Fügen Sie
in Ihrem AppDelegate
Inneren application(_ application: didFinishLaunchingWithOptions)
diese Zeile hinzu:
UIViewController.swizzlePresent()
Auf diese Weise müssen Sie bei keinem aktuellen Aufruf Änderungen vornehmen, da wir die aktuelle Methodenimplementierung zur Laufzeit ersetzen.
Wenn Sie wissen müssen, was schwirrt, können Sie diesen Link überprüfen:
https://nshipster.com/swift-objc-runtime/
fullScreen
Option sollte standardmäßig aktiviert sein, um Änderungen an der Benutzeroberfläche zu verhindern.