WKWebView 和 UIMenuController
Posted
技术标签:
【中文标题】WKWebView 和 UIMenuController【英文标题】:WKWebView and UIMenuController 【发布时间】:2014-09-25 19:00:31 【问题描述】:我有一个带有WKWebView
的应用程序。在这个应用程序中,我自定义了UIMenuController
中提供的选项。无论我做什么,网络视图似乎都会向菜单添加复制和定义选项。如果我将自己设置为第一响应者并对所有内容都返回 NO,我仍然会得到复制和定义选项。而且我已经实现了自己的复制选项,该选项根据用户偏好和确切选择的内容执行特殊操作。有没有办法删除这些额外的选项?
更新:我已将其归档为雷达 18487289。
【问题讨论】:
我也有同样的问题,有进展吗? @avdyushin 没有。但我在WWDC。这周要去问问别人。 @avdyushin 这是一个已知问题,但没有时间表。现在的完整解决方法是隐藏 willShow 上的菜单,并使用您想要的任何选项制作和展示您自己的菜单。 谢谢,将使用UIMenuControllerWillShowMenuNotification
通知...
大家好,有什么更新吗?我尝试调用 menuVisible=NO UIMenuControllerWillShowMenuNotification 但它没有隐藏默认的复制/定义/共享...菜单
【参考方案1】:
对于 ios 11,只需继承 WKWebView
并覆盖 canPerformAction
以返回 false
:
class WebView : WKWebView
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
return false
对于 iOS 10 或更早版本,调配 WKContentView
的 canPerformAction
方法:
@objc private extension UIResponder
func swizzle_canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
return false
guard let viewClass = NSClassFromString("WKContentView") as? UIView.Type else return
method_exchangeImplementations(
class_getInstanceMethod(viewClass, #selector(UIResponder.canPerformAction))!,
class_getInstanceMethod(UIResponder.self, #selector(UIResponder.swizzle_canPerformAction))!
)
删除这些 web 视图的内置菜单项后,您可以像往常一样通过 UIMenuController.shared
添加自定义菜单项。
【讨论】:
【参考方案2】:这似乎已在 iOS 13 beta 1 中修复。
【讨论】:
以上是关于WKWebView 和 UIMenuController的主要内容,如果未能解决你的问题,请参考以下文章