Có nhiều cách để làm điều đó và tôi nghĩ rằng mỗi người có thể phù hợp với một dự án nhưng không phải là một dự án khác, vì vậy tôi nghĩ tôi sẽ giữ chúng ở đây có thể người khác sẽ chạy đến một trường hợp khác.
1- Ghi đè hiện tại
Nếu bạn có một BaseViewController
bạn có thể ghi đè present(_ viewControllerToPresent: animated flag: completion:)
phương thức.
class BaseViewController: UIViewController {
// ....
override func present(_ viewControllerToPresent: UIViewController,
animated flag: Bool,
completion: (() -> Void)? = nil) {
viewControllerToPresent.modalPresentationStyle = .fullScreen
super.present(viewControllerToPresent, animated: flag, completion: completion)
}
// ....
}
Sử dụng theo cách này, bạn không cần thực hiện bất kỳ thay đổi nào đối với bất kỳ present
cuộc gọi nào , vì chúng tôi chỉ áp dụng present
phương thức này.
2- Một phần mở rộng:
extension UIViewController {
func presentInFullScreen(_ viewController: UIViewController,
animated: Bool,
completion: (() -> Void)? = nil) {
viewController.modalPresentationStyle = .fullScreen
present(viewController, animated: animated, completion: completion)
}
}
Sử dụng:
presentInFullScreen(viewController, animated: true)
3- Đối với một UIViewContoder
let viewController = UIViewController()
viewController.modalPresentationStyle = .fullScreen
present(viewController, animated: true, completion: nil)
4- Từ Storyboard
Chọn một segue và đặt bản trình bày thành FullScreen
.
5- Lướt
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)
}
}
Cách sử dụng:
Trong AppDelegate
bên trong của bạn application(_ application: didFinishLaunchingWithOptions)
thêm dòng này:
UIViewController.swizzlePresent()
Sử dụng theo cách này, bạn không cần thực hiện bất kỳ thay đổi nào đối với bất kỳ cuộc gọi hiện tại nào, vì chúng tôi đang thay thế việc thực hiện phương thức hiện tại trong thời gian chạy.
Nếu bạn cần biết những gì đang xảy ra, bạn có thể kiểm tra liên kết này:
https://nshipster.com/swift-objc-r nb /
fullScreen
tùy chọn nên mặc định để ngăn chặn những thay đổi giao diện người dùng bẻ.