Поэтому мое требование заключается в том, чтобы каждый раз, когда пользователь нажимал и удерживал ссылку веб-страниц, показанную в WKWebview, показывал таблицу действий с возможностью загрузки нажатого URL-адреса.
Я использую приведенный ниже код, чтобы определить, будет ли отображаться контекстное меню для нажатойurl
extension UINavigationController {
override open func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) {
guard let alertController = viewControllerToPresent as? UIAlertController,
alertController.preferredStyle == .actionSheet else {
// Not an alert controller, present normally
super.present(viewControllerToPresent, animated: flag, completion: completion)
return
}
guard let alertTitle = alertController.title else {
return
}
guard let url = URL(string: alertTitle) else {
return
}
if appDelegate.browserConfigration?.allow_downloads == false {
return
}
if UIApplication.shared.canOpenURL(url) == false{
super.present(viewControllerToPresent, animated: flag, completion: completion)
return
}
//if it's valid url then only override UIAlertController, for long press gesture on url
let customAlertController:UIAlertController = UIAlertController(title: alertTitle, message: nil, preferredStyle: .actionSheet)
customAlertController.addAction(UIAlertAction(title: "DOWNLOAD_LINK".localized, style: .default, handler: { _ in
//download this link
Download.newDownload(downloadOrigin: url)
}))
customAlertController.addAction(UIAlertAction(title: "BUTTON_CANCEL".localized, style: .cancel, handler: { _ in
}))
if UIDevice.current.userInterfaceIdiom == .pad {
//if it's valid url then only override UIAlertController, for long press gesture on url
if let popoverController = customAlertController.popoverPresentationController {
popoverController.sourceView = self.view
guard let shareBarButton = TabContainer.currentInstance?.delegate?.getShareButton() else{
return
}
popoverController.barButtonItem = shareBarButton
//appDelegate.popOverDownloadLink = popoverController
}
}
super.present(customAlertController, animated: flag, completion:completion)
}
}
приведенный выше код прекрасно работает для iPhone, но для iPAD ActionSheet выполнен в виде PopOver, и этот также отлично работает, но всякий раз, когда отображается поповер, одновременно происходит поворот экрана, отображаются два всплывающих окна, один мой предоставленный popover для загрузки ссылки, а второй на самом деле контекстное меню для ссылки нажмите и удерживайте см. изображение для справки
Решение яищу -
1) При ротации контекстное меню не должно отображаться, только там должен быть мой предоставленный поповер для ссылки на скачивание.
2) Если я не могу добиться 1-го варианта отклонитьоба поповера при повороте тоже подходят мне.