在 WKWebView UIMenuController 中隐藏复制、查找、共享...
Posted
技术标签:
【中文标题】在 WKWebView UIMenuController 中隐藏复制、查找、共享...【英文标题】:Hiding Copy, Look Up, Share... in WKWebView UIMenuController 【发布时间】:2021-08-20 20:01:35 【问题描述】:我正在为react-native-webview 进行 PR 以将自定义菜单项添加到 RNCWebView(它是 WKWebView 的子类)。它的工作原理是它添加了附加选项,但“复制|查找|共享...”总是出现。即使canPerformAction
为每个操作返回NO
(注意canPerformAction
不会为copy
返回true/YES)
我遇到过很多其他帖子,例如:
WKWebView and UIMenuController Removing Copy, Look Up, and Share from UIMenuController Custom Cut, Copy & Paste operations for WKWebView还有无数其他的只是建议使用 CSS 来隐藏整个菜单。我不想隐藏整个菜单,而只是“复制、查找和共享”,同时让我的自定义菜单在使用 WKWebView 时保留。
我的想法是,响应者链上还有其他一些类仍在将它们设置为 true,但我已尝试扩展和覆盖我所知道的尽可能多的选项,但这些选项仍然显示:
extension UIView
open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
return false
extension UITextView
open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
return false
extension UIImageView
open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
return false
extension UIScrollView
open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
return false
extension UISlider
open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
return false
extension UIWebView
open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
return false
@objc private extension UIResponder
func swizzle_canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
return false
这些都不起作用。无论如何,这三个选项仍然出现。有谁知道哪个班级可以响应并添加这些选项?这似乎是一个常见问题,但我发现的所有帖子要么没有答案,要么完全过时。
【问题讨论】:
我可以删除复制、剪切、全选、粘贴项目。我认为您无法删除查找和共享项目。 显示您添加自定义menuItem
s 的行。
@ElTomato 我在这里从这个包中将它们添加到 WebView:github.com/react-native-webview/react-native-webview/pull/2101/…
那我提交解决方案后怎么办?
【参考方案1】:
// WKWebView subclass //
import WebKit
import UIKit
class MyWebView: WKWebView
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
return false
// View controller //
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate
// MARK: - Variables
var helloMenu = UIMenuItem()
// MARK: - IBOutlet
@IBOutlet weak var myWebView: MyWebView!
// MARK: - Life cycle
override func viewDidLoad()
super.viewDidLoad()
myWebView.navigationDelegate = self
helloMenu = UIMenuItem(title: "Hello", action: #selector(sayHello))
UIMenuController.shared.menuItems = [helloMenu]
override func viewDidAppear(_ animated: Bool)
super.viewDidAppear(animated)
let urlStr = "https://www.google.com/"
if let url = URL(string: urlStr)
let request = URLRequest(url: url)
myWebView.load(request)
// MARK: - Custom menu
@objc func sayHello()
print("Hello")
-
首先,子类
WKWebView
,删除所有菜单项。
创建一个WKWebView
的IBOutlet 对象并更改其类名。
将自定义菜单项添加到视图控制器。
【讨论】:
以上是关于在 WKWebView UIMenuController 中隐藏复制、查找、共享...的主要内容,如果未能解决你的问题,请参考以下文章