Ada banyak cara untuk melakukan itu, dan saya pikir masing-masing bisa cocok untuk satu proyek tetapi tidak yang lain, jadi saya pikir saya akan menyimpannya di sini mungkin orang lain akan lari ke kasus yang berbeda.
1- Timpa yang ada
Jika sudah, BaseViewController
Anda dapat mengganti present(_ viewControllerToPresent: animated flag: completion:)
metode.
class BaseViewController: UIViewController {
// ....
override func present(_ viewControllerToPresent: UIViewController,
animated flag: Bool,
completion: (() -> Void)? = nil) {
viewControllerToPresent.modalPresentationStyle = .fullScreen
super.present(viewControllerToPresent, animated: flag, completion: completion)
}
// ....
}
Dengan menggunakan cara ini Anda tidak perlu melakukan perubahan apa pun pada present
panggilan apa pun , karena kami hanya mengesampingkan present
metode ini.
2- Perpanjangan:
extension UIViewController {
func presentInFullScreen(_ viewController: UIViewController,
animated: Bool,
completion: (() -> Void)? = nil) {
viewController.modalPresentationStyle = .fullScreen
present(viewController, animated: animated, completion: completion)
}
}
Pemakaian:
presentInFullScreen(viewController, animated: true)
3- Untuk satu UIViewController
let viewController = UIViewController()
viewController.modalPresentationStyle = .fullScreen
present(viewController, animated: true, completion: nil)
4- Dari Storyboard
Pilih segue dan atur presentasi ke 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)
}
}
Penggunaan:
Di AppDelegate
bagian dalam Anda application(_ application: didFinishLaunchingWithOptions)
tambahkan baris ini:
UIViewController.swizzlePresent()
Dengan menggunakan cara ini Anda tidak perlu melakukan perubahan apa pun pada panggilan saat ini, karena kami mengganti implementasi metode saat ini di runtime.
Jika Anda perlu tahu apa yang membingungkan Anda dapat memeriksa tautan ini:
https://nshipster.com/swift-objc-runtime/
fullScreen
pilihan harus menjadi default untuk mencegah perubahan UI melanggar.