WKWebView:如何更改长按操作或禁用它?

9

大家好(为什么我的问候消息总是被删除???!!!)

尽管我查阅了许多与此相关的主题,但并未找到有关我的问题的适当答案。

我想知道是否可以禁用wkwebview窗口上的长按事件或检测用户何时使用长按事件来执行我想要的操作?

实际上,我想通过使用长按事件将网站上的图像链接复制到变量中,并且我根本不希望弹出菜单被调用。

我正在使用Swift

谢谢您的帮助!


我之前在Swift中做过同样的事情,不过使用的是UIWebView而不是WKWebView,但是应该是一样的。 - Siavash Alp
你好,感谢你的回答。你是如何在UIWebView上实现这个的? - Sam
嘿,我所做的是将 UILongPressGestureRecognizer 添加到 UIWebView 上,并在其上禁用 actionSheet。然后,在长按时,我的操作被触发,并且我在每次长按时在 WebView 顶部呈现一个新视图。 - Siavash Alp
3
感谢您的回复。我有两个问题:1:如何禁用原始的长按操作? 2:如何知道我的手指按压的图像文件链接? - Sam
有关那个的任何更新吗? - Randy
大家好,经过这么长时间我仍然不知道该怎么做... 我有一个函数,如果我在屏幕上长按,它可以工作,但是只有在默认菜单没有被触发的情况下才能工作。所以我仍然在想如何禁用默认的长按菜单操作。 - Sam
3个回答

1
你可以使用这个来禁用弹出视图,同时保留高亮显示。
func swizzle() {

    guard let cls = NSClassFromString("UICalloutBar") else { return }
    let originalSelector = NSSelectorFromString("appear")
    let swizzledSelector = #selector(UIView.appearHijack)
    let originMethod = class_getInstanceMethod(cls, originalSelector)
    let swizzleMethod = class_getInstanceMethod(UIView.self, swizzledSelector)
    if let swizzledMethod = swizzleMethod, let originalMethod = originMethod{
        method_exchangeImplementations(originalMethod, swizzledMethod)
    }
    
    
}
        



extension UIView{
    @objc func appearHijack(){
        
    }
}

swizzle()应该仅被调用一次。


我怎么了解 UICalloutBar

只需使用断点,同时bt也是一个选项。

888


1
只需劫持相关内容。
func swizzle(){
    guard let cls = NSClassFromString("UITextSelectionView") else { return }
    let originalSelector = NSSelectorFromString("updateSelectionRects")
    let swizzledSelector = #selector(UIView.updateSelectionRectsHijack)
    let originMethod = class_getInstanceMethod(cls, originalSelector)
    let swizzleMethod = class_getInstanceMethod(UIView.self, swizzledSelector)
    if let swizzledMethod = swizzleMethod, let originalMethod = originMethod{
        method_exchangeImplementations(originalMethod, swizzledMethod)
    }
}

extension UIView{
    @objc func updateSelectionRectsHijack(){ }
}

swizzle()应该只调用一次。


UITextSelectionView是什么?

检查View Hierarchy,

999


方法updateSelectionRects是什么意思?

通过runtime

import ObjectiveC
    {
        var count: UInt32 = 0
        guard let methodArr = class_copyMethodList(NSClassFromString("UITextSelectionView"), &count) else { return }
        
        let cnt = Int(count)
        for i in 0..<cnt{
            let method = methodArr[i]
            let name = method_getName(method)
            if let type = method_getTypeEncoding(method){
                print(name, String(utf8String: type) ?? " _ | _ ")
            }
        }
   }

0

对于iOS 16:

@available(iOS 16.0, *)
func swizzleiOS16() {
    guard let cls = NSClassFromString("UIEditMenuInteraction") else { return }
    let originalSelector = NSSelectorFromString("presentEditMenuWithConfiguration:")
    let swizzledSelector = #selector(UIEditMenuInteraction.presentEditMenuWithConfigurationHijack)
    let originMethod = class_getInstanceMethod(cls, originalSelector)
    let swizzleMethod = class_getInstanceMethod(UIEditMenuInteraction.self, swizzledSelector)
    if let swizzledMethod = swizzleMethod, let originalMethod = originMethod{
        method_exchangeImplementations(originalMethod, swizzledMethod)
    }
}

@available(iOS 16.0, *)
extension UIEditMenuInteraction{
    @objc func presentEditMenuWithConfigurationHijack() {
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接