Bunu yapmanın birden fazla yolu var ve bence her biri bir projeye sığabilir, ancak başka bir projeye uymayabilir, bu yüzden onları burada tutacağımı düşündüm belki başka biri farklı bir davaya koşacak.
1- Mevcut olanları geçersiz kıl
Varsa BaseViewController
, present(_ viewControllerToPresent: animated flag: completion:)
yöntemi geçersiz kılabilirsiniz .
class BaseViewController: UIViewController {
// ....
override func present(_ viewControllerToPresent: UIViewController,
animated flag: Bool,
completion: (() -> Void)? = nil) {
viewControllerToPresent.modalPresentationStyle = .fullScreen
super.present(viewControllerToPresent, animated: flag, completion: completion)
}
// ....
}
Bu yöntemi kullanarak, herhangi bir present
çağrıda herhangi bir değişiklik yapmanız gerekmez , çünkü present
yöntemi aştık .
2- Bir uzantı:
extension UIViewController {
func presentInFullScreen(_ viewController: UIViewController,
animated: Bool,
completion: (() -> Void)? = nil) {
viewController.modalPresentationStyle = .fullScreen
present(viewController, animated: animated, completion: completion)
}
}
Kullanımı:
presentInFullScreen(viewController, animated: true)
3- Bir UIViewController için
let viewController = UIViewController()
viewController.modalPresentationStyle = .fullScreen
present(viewController, animated: true, completion: nil)
4- Film şeridinden
Bir segue seçin ve sunuyu olarak ayarlayın FullScreen
.
5- Kıvrılma
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)
}
}
Kullanımı:
sizin de AppDelegate
içeriden application(_ application: didFinishLaunchingWithOptions)
bu satırı ekleyin:
UIViewController.swizzlePresent()
Bu yöntemle, mevcut yöntem uygulamasını çalışma zamanında değiştirdiğimizden, mevcut çağrılarda herhangi bir değişiklik yapmanız gerekmez.
Neyin değiştiğini bilmeniz gerekiyorsa, bu bağlantıyı kontrol edebilirsiniz:
https://nshipster.com/swift-objc-runtime/
fullScreen
Seçenek kırılma UI değişiklikleri önlemek için varsayılan olmalıdır.