【问题标题】:WKWebView and UIMenuControllerWKWebView 和 UIMenuController
【发布时间】:2014-09-25 19:00:31
【问题描述】:

我有一个带有WKWebView 的应用程序。在这个应用程序中,我自定义了UIMenuController 中提供的选项。无论我做什么,网络视图似乎都会向菜单添加复制和定义选项。如果我将自己设置为第一响应者并对所有内容都返回 NO,我仍然会得到复制和定义选项。而且我已经实现了自己的复制选项,该选项根据用户偏好和确切选择的内容执行特殊操作。有没有办法删除这些额外的选项?

更新:我已将其归档为雷达 18487289。

【问题讨论】:

  • 我也有同样的问题,有进展吗?
  • @avdyushin 没有。但我在WWDC。这周要去问问别人。
  • @avdyushin 这是一个已知问题,但没有时间表。现在的完整解决方法是隐藏 willShow 上的菜单,并使用您想要的任何选项制作和展示您自己的菜单。
  • 谢谢,将使用UIMenuControllerWillShowMenuNotification 通知...
  • 大家好,有什么更新吗?我尝试调用 menuVisible=NO UIMenuControllerWillShowMenuNotification 但它没有隐藏默认的复制/定义/共享...菜单

标签: ios ios8 uimenucontroller wkwebview


【解决方案1】:

对于 iOS 11,只需继承 WKWebView 并覆盖 canPerformAction 以返回 false

class WebView : WKWebView {
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return false
    }
}

对于 iOS 10 或更早版本,调配 WKContentViewcanPerformAction 方法:

@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 中修复。

    【讨论】:

      猜你喜欢
      • 2020-02-27
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      相关资源
      最近更新 更多