Как правильно сказано @ jshapy8, вам необходимо переопределить метод present()
и вручную установить .sourceView
/ .sourceFrame
/ .barButtonItem
. Но вы должны иметь в виду, что в случае, если UIViewController
, который содержит WkWebView
, представлен UINavigationController
, UINavigationController
отвечает за представление других UIViewController
.
Если вы не являетесьна iPad.
Так что на самом деле вам необходимо переопределить метод present()
в вашем UINavigationController
, а также в UIViewController
, который содержит WkWebView
.
ВВ приведенном ниже примере UIViewController
, который содержит WkWebView
, называется WebVC
.
. В вашем UINavigationController
вам нужно добавить:
override func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) {
if let webVC = viewControllers.filter({ $0 is WebVC }).first as? WebVC {
webVC.setUIDocumentMenuViewControllerSoureViewsIfNeeded(viewControllerToPresent)
}
super.present(viewControllerToPresent, animated: flag, completion: completion)
}
И в вашем WebVC
вам нужно добавить:
override func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) {
setUIDocumentMenuViewControllerSoureViewsIfNeeded(viewControllerToPresent)
super.present(viewControllerToPresent, animated: flag, completion: completion)
}
func setUIDocumentMenuViewControllerSoureViewsIfNeeded(_ viewControllerToPresent: UIViewController) {
if #available(iOS 13, *), viewControllerToPresent is UIDocumentMenuViewController && UIDevice.current.userInterfaceIdiom == .phone {
// Prevent the app from crashing if the WKWebView decides to present a UIDocumentMenuViewController while it self is presented modally.
viewControllerToPresent.popoverPresentationController?.sourceView = webView
viewControllerToPresent.popoverPresentationController?.sourceRect = CGRect(x: webView.center.x, y: webView.center.y, width: 1, height: 1)
}
}
Таким образом, вы можете использовать новый стиль модальной презентации iOS 13 и загружать файлы без сбоев ?
Редактировать: Такое поведение при сбое, похоже, (другое) iOS 13ошибка, потому что это проблема только на iPhone, а не на iPad (только что проверил это на iPad с iOS 12 и 13. Похоже, что инженеры Apple просто забыли, что в случае, если WKWebView
представлен с их новым модальным стилем презентации,UIDocumentMenuViewController
представлен в стиле UIModalPresentationPopover
, даже на телефонах, который был доOS 13 попросту не подходит.
Я обновил свой код, поэтому теперь он устанавливает .sourceView
/ .sourceFrame
/ .barButtonItem
только для типов телефонов, потому что типы планшетов будут обрабатываться iOS самостоятельно.