【问题标题】:WKWebView : How to change Long press action or disable it?WKWebView:如何更改长按动作或禁用它?
【发布时间】:2017-01-12 05:19:36
【问题描述】:

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

即使我阅读了很多关于它的主题,我也没有找到关于我的问题的正确答案。

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

实际上我想通过长按事件将图像链接从网站复制到变量中,我根本不想调用弹出窗口。

我正在使用 Swift

感谢您的帮助!

【问题讨论】:

  • 我之前在 Swift 中做过同样的事情,但是它是 UIWebView 而不是 WKWebView 但假设它应该是相同的。
  • 您好,感谢您的回答。你是如何在 UIWebView 上管理这个的?
  • 嘿,所以我所做的是将UILongPressGestureRecognizer 添加到UIWebView 并禁用actionSheet,然后在LongPress 上我的动作被触发并且我正在呈现一个新视图在每个 LongPress 上的 WebView 顶部。
  • 再次感谢您的回答。这种方法我有两个问题: 1:如何禁用原来的长按动作? 2:如何知道我手指按下的图片文件链接?
  • 有什么更新吗?

标签: ios swift wkwebview long-press


【解决方案1】:

只需hijack 相关的,

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


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) ?? " _ | _ ")
            }
        }
   }

【讨论】:

    【解决方案2】:

    您可以使用它来禁用pop up 视图,同时突出显示仍然存在

    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

    只需使用break pointbt 也是一个选项。

    【讨论】:

      猜你喜欢
      • 2023-01-12
      • 2021-11-20
      • 1970-01-01
      • 2012-09-14
      • 2018-07-17
      • 2015-04-22
      • 2013-06-04
      • 2018-10-20
      • 1970-01-01
      相关资源
      最近更新 更多