无法在 iOS 13.4 上与 WKWebView 同时处理触摸

2024-01-28

Problem:从 iOS 13.4 开始,WebKit 会拦截之前传递给系统的手势,并可以通过UIGestureRecognizer同时地

演示项目:我创建WKWebView并将其添加到UIViewController的观点。我也创建了UIPinchGestureRecognizer并将其添加到UIViewControler的看法也是如此。

class ViewController: UIViewController, UIGestureRecognizerDelegate, WKNavigationDelegate {

    var webView: WKWebView?

    override func viewDidLoad() {
        super.viewDidLoad()

        let pinch = UIPinchGestureRecognizer(target: self, action: #selector(self.pinchHandler))
        pinch.delegate = self
        self.view.addGestureRecognizer(pinch)

        addWebView()
    }

    func addWebView() {
        let webView = WKWebView()
        webView.translatesAutoresizingMaskIntoConstraints = false
        self.view.addSubview(webView)
        NSLayoutConstraint.activate([
            webView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            webView.topAnchor.constraint(equalTo: view.topAnchor),
            webView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            webView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
        ])

        self.webView = webView
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if let localHtmlFile = Bundle.main.url(forResource: "index", withExtension: "html") {
            let request = URLRequest(url: localHtmlFile)
            webView?.load(request)
        }
    }

    @objc func pinchHandler() {
        debugPrint("PinchHandler called")
    }

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive event: UIEvent) -> Bool {
        if event.type == .touches {
            return true
        }
        return false
    }

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        return true
    }
}

我尝试运行添加到主包中的示例 html 网站:

<html>
    <head>
        <style>
            .center {
              width: 100%;
              height: 100%;
              border: 3px solid #73AD21;
              text-align: center;
              font-size: 100;
              overflow: hidden;
            }
        </style>
        <script>
            function move(event) {
                console.log(event);
                event.preventDefault()
            }
        </script>
    </head>

    <body ontouchmove="move(event)" class="center">
            <p id="content">
                demo
            </p>
    </body
</html>

网站拦截touchmove活动,我将取消它move(event)功能。

当我在 iOS 13.0 模拟器上运行此代码 10 次时,每次我的处理程序都起作用。当我在 iOS 13.4 模拟器上运行此代码 10 次时,我的捏合处理程序工作了 4 次,没有工作 6 次。


我最终转而使用 Javascript 来检测网络视图上的点击。 一个跑步游乐场展示了如何做到这一点:

import UIKit
import PlaygroundSupport
import WebKit

class TouchDetectionOnWKWebViewUsingJSDemoVC : UIViewController, WKScriptMessageHandler {
  override func loadView() {
    let config = WKWebViewConfiguration()
    let webView = WKWebView(frame: .init(origin: .zero, size: .init(width: 100, height: 200)), configuration: config)

    let jsEvent = "touchstart"
    let handlerName = "handler"
    let jsCode =
    """
    window.addEventListener('\(jsEvent)', function(e) {
      window.webkit.messageHandlers.\(handlerName).postMessage('\(jsEvent)')
    })
    """

    let jsScript = WKUserScript(source: jsCode, injectionTime: .atDocumentEnd, forMainFrameOnly: false)
    config.userContentController.addUserScript(jsScript)
    config.userContentController.add(self, name: handlerName)

    let demoURL = URL(string: "https://developer.apple.com/")!
    webView.load(URLRequest(url: demoURL))

    self.view = webView
  }

  func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    print(message.body)
  }
}

PlaygroundPage.current.liveView = TouchDetectionOnWKWebViewUsingJSDemoVC()

在示例中我展示了如何监听touchstart事件,但它可以是任何 js 事件,例如:touchend, touchmove, gesturestart, gestureend, 和别的。我们甚至可以监听滚动事件(但我认为最好是webView.scrollView代表)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 iOS 13.4 上与 WKWebView 同时处理触摸 的相关文章

  • 如何让应用更新以吸引人的屏幕形式提供给用户? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我最近在使用 Make My Trip 应用程序 我发现每当我启动应用程序时都会出现一个非常有吸引力的应用程序更新弹出屏幕 它说要更新应用程
  • 领域数据库对象看起来是空的,但实际上不是

    我在用Realm https realm io对于一个小而简单的项目 我正在使用最新版本的框架 昨天从 Github 编译 和当前 AppStore 版本的 Xcode with Swift 2 1 我正在通过 segue 将 Realm
  • 无法在 Swift 中创建文件路径

    我尝试在 Swift 中打开该文件 为此 我创建了文件路径 这不起作用 maaaacy pwd Users tsypa maaaacy cat a txt test maaaacy a swift nil maaaacy 剧本 usr bi
  • Xcode 6.4 Swift 单元测试无法编译:“GPUImage.h 未找到”“无法导入桥接标头”

    我的 Xcode 项目构建并运行良好 它有 Swift 和 Objective C 代码 它已安装 GPUImage 我向它添加了单元测试 现在它将不再编译 找不到 GPUImage h 文件 导入桥接标头失败 以下是我发现并尝试过的解决方
  • 输入数字最大属性调整字段大小

    当在 Chrome 中向输入数字字段添加最大值时 它将根据最大值的宽度重新调整字段的大小 看来我无法控制调整大小的行为
  • 如何读取 Xcode 6.1 Instruments .trace 文件?

    我一直在尝试阅读 trace文件 我使用生成的custom仪器模板 仪器 自动机 分配 Leaks using 仪器 https developer apple com library mac documentation Developer
  • 如何使用存储在 Cocoa Touch 框架中的 Localized.strings?

    我想为 CocoaTouch 框架添加多语言支持 问题 可本地化的字符串我创建的文件仅被使用NSLocalizedString当它是主应用程序及其目标的一部分时 我想将其存储在框架内以将事物分开 我怎样才能使用可本地化的字符串当放置在 Co
  • 如何快速防止标签中出现孤儿?

    我有一个可以有一两行的标签 如果它有两行 我希望第二行至少有两个 或者可能三个 单词 而不仅仅是一个 关于如何使用 swift 实现这一点有什么想法吗 提前致谢 Daniel 编辑 我删除了我愚蠢的第一个想法 这些想法并没有真正的帮助 好吧
  • 未捕获的 Kotlin 异常:kotlin.native.In CorrectDereferenceException:非法尝试访问非共享

    我尝试使用 Kotlin MPP Multiplatform 开发 Android 和 iOS 之间的共享库 但我面临着 iOS 中线程的问题 对于我在 iOS 中的应用程序 我在主线程中建立了对象 但它可能调用其他线程中的函数并抛出此异常
  • Swift 中的 quitFirstResponder

    我怎样才能用Apple的新语言实现它 Objective C 代码 void touchesBegan NSSet touches withEvent UIEvent event for UIView view in self view s
  • 如何无限地每1分钟运行一个iOS应用程序?

    我制作了一个应用程序 需要每 1 分钟向服务器发送一次位置和状态更新 我尝试了以下方法 但没有一个能帮助我 有什么解决办法吗 1 NSTimer 很多人建议这样做 但问题出在后台模式上 它只能工作 20 分钟 该应用程序停止发送数据后 2
  • skView.ignoreSiblingOrder 在 swift 中的重要性/效率?

    这样做有多重要 高效skView ignoreSiblingOrder true初始化场景时 现在 我将其设置为 true 但由于某种原因 当我从 MainMenu 场景启动 GameScene 时 它 会在我的角色之前加载背景 即使背景的
  • 在 Swift 中使用 commitEditingStyle 动态删除 UITable 部分

    我正在处理一个无法解决的问题 我有一个来自客户数据库数组的名称表 每个客户在其他数据成员中都有一个名称属性 我可以成功删除某个部分中的行 但我不能删除该部分 当该部分中的最后一行被删除时 该部分必须消失 I got NSInternalIn
  • 在SwiftUI中,如何高性能地绘制阴影?

    我用 shadow color radius x y 在我的应用程序中绘制阴影 这是我所知道的在 SwiftUI 中绘制应用程序的唯一方法 我用 sheet isPresented content 方法弹出一个视图 其中包含很多阴影 当我调
  • 使用prepareForSegue传递数据

    我试图将数据从viewController 1传递到viewController2 我有2个按钮和1个segue 因此有一个segue标识符 这2个按钮 按下时每个按钮应显示 1个标签用于显示标题 1个textView用于显示定义 我很难显
  • CustomNSError 协议有什么作用以及为什么我应该采用它?

    什么是CustomNSError协议的用途以及为什么我应该采用它 Apple提供的文档仅指出 描述错误类型 具体提供域 代码和 用户信息字典 我已经在谷歌上搜索过 但找不到与我的问题相关的任何内容 每种类型都符合Error协议是隐含地桥接的
  • let/var 如何解决可变性? [复制]

    这个问题在这里已经有答案了 我没有任何问题 我只是想对有关可变性的问题进行一些澄清 在 Objective C 中我们会使用例如NSMutableArray得到一个可变数组和NSArray得到一个不可变的 我对两者的内部运作了解不多 但据我
  • iOS 13 检查 CLLocationManager 的临时授权状态

    根据 WWDC 视频 https developer apple com videos play wwdc2019 705 https developer apple com videos play wwdc2019 705 当你要求 Al
  • UITesting、XCTest 当前 ViewController 类

    简单的问题 我有一个按钮可以执行到下一个视图控制器的操作 我想写 UI XCTest 来告诉我它是否打开了我想要的视图控制器 UI 测试框架无法访问您的应用程序代码 这使得无法对实例进行类断言 你不能够directly告诉屏幕上的控制器的类
  • NSURLCache 不缓存

    我正在使用 Xcode 6 1 6A1030 iOS7 和 iOS8 模拟器 NSURLCache 似乎没有缓存任何东西 我使用 Cache Control 标头 我的服务器返回带有 max age 6000 的 Cache Control

随机推荐

  • Webactivator 无法在 IIS 7 上运行

    我有几个使用 WebActivator 来使用包的 Web 应用程序 在装有 IIS 7 5 Express 的本地计算机上 无论我在发布配置还是调试配置中进行测试 一切都正常 但是 在装有 IIS 7 5 的生产计算机上 WebActiv
  • 如何使用 jQuery 将文本添加到特定的 div 元素?

    我在使用 jquery 时遇到了问题 我的 HTML 是 div span class test span div div span class test span div 现在我尝试使用 Jquery 在 span 中添加文本 j spa
  • PostgreSQL 数据库服务

    我从他们的网站下载了 PostgreSQL http www postgresql org download windows http www postgresql org download windows 但是 我无法从中创建数据库pgA
  • MySQL:更新语句中等号冒号 =: 是什么意思?

    我遇到了以下 MySQL 查询 update table set itemId itemId startDate startDate where id id 但是我无法弄清楚 是什么意思 我认为 后面的名称是一个变量 但是如何检查里面有什么
  • Maven 替换器:替换值包含美元符号

    我正在处理一个 Maven 脚本 我必须修改一些文件内容 我目前正在使用替换插件 当替换值包含美元符号时 这会给我带来麻烦 我遇到问题的替换相对简单 在我的 log4j xml 中 替换该行
  • Kubernetes PVC删除POD的内容

    我有一个正在运行的 Kubernetes POD 并且已将 PVC 附加到它 PVC 卷为 opt stackstorm 默认情况下 opt stackstorm 中有一些文件 它们是 docker 官方镜像的一部分 当没有 PVC 连接到
  • 结构体是否可以序列化[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我可以序列化一个struct直接输入 因为它是值类型 我在课堂上使用过它 但想知道它是否可以单独用于结构 e g str
  • 挂锁的 Unicode 字形

    我需要使用看起来像挂锁的 unicode 字符 它用于表单下方的一个按钮 上面写着 CopyLink 上面有一个挂锁 表明当他们复制所在页面的链接时 访问该页面的 copylink 版本的人将不会被访问 能够修改表格 无论如何 我环顾四周
  • API 来确定手机运营商? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有免费的 API 或其他方式来确定手机号码注册的运营商 我希望我的应用程序能够广播短信 而无需他们从列表中选择运营商 UPDATE 有
  • 从方法返回可选值的 std::Optional 的最佳替代方案? (使用C++98/C++11/C++14)

    明显地 std optional如果使用 C 17 或 boost 则这是从函数返回可选值的最佳选择 另请参阅GOTW 90 http herbsutter com 2013 05 30 gotw 90 solution factories
  • chrome扩展shadow DOM导入引导字体

    所以我想在从 chrome 扩展内容脚本添加的 Shadowroot 中显示 Bootstrap 3 图标 到目前为止它不起作用 有帮助吗 manifest js 确实在 web accessible resources 中包含 woff
  • 使用 Vite 将 JS 和 CSS 捆绑到单个文件中

    我正在费尽心思地弄清楚如何在我的 Svelte 项目中从 Vite 构建单个 js 文件 其中包括我的 Svelte 项目中构建的所有 javascript 和 CSS 默认情况下 Vite 将应用程序捆绑到一个 html 文件 这可以 两
  • 解决设置属性“System.Windows.Controls.Decorator.Child”在 DataTemplate 中引发异常

    我创建了以下数据模板
  • 如何使用 NuGet 包部署 T4 包含文件

    我有一些 T4 包含文件 我想在多个项目中重用它们 因此 我创建了一个 NuGet 包并将文件放置在该包的 Tools 文件夹中 现在它们安装在packages PackageName x x x Tools文件夹 我可以在项目的 T4 文
  • localStorage - 将对象追加到对象数组中

    我正在尝试将对象本地存储在对象的数组中 如果我在控制台中尝试以下操作 它会完美运行 theObject theObject theArray arrayObj One 111 theObject theArray push arrayObj
  • 如何将音频数据数组转换为 wav 文件?

    我有一个为用户记录音频注释的功能 它使用 HTML5 并带有 Flash 后备功能 我可以通过 getUserMedia 从 HTML5 版本获取音频数据 但 Flash 回退以浮点数组形式提供数据 我需要这些数据作为 wav 文件 但我不
  • 如何在单独的列中设置每个 UICollectionView 部分

    我有一个UICollectionView其中含有给定量的sections它们中的每一个都包含一定数量的rows 现在 由于我将网格布局指定为垂直 UICollectionView看起来像这样 然而 当屏幕宽度放大时 例如在横向模式或 iPa
  • 将 CSSearchableItem 添加到 Core Spotlight (MacOS) 时出现未知错误

    我最近想使用 Core Spotlight 为我的一个项目中的搜索提供支持 但是 每当我将 CSSearchableItem 添加到 SearchIndex 时 我都会在完成处理程序中收到错误 其描述如下 The operation cou
  • 使用 JavaScript 和 jQuery 的专业菜单

    我为我的 WordPress 网站设计了一个菜单 我的菜单有两个主要问题 1 当我单击图标时 将灰色显示在整个屏幕上的 back 类变为黑色 使背景变成全黑 2 第二个问题与我点击灰色区域时有关 当放在body上时带有 back 类 我成功
  • 无法在 iOS 13.4 上与 WKWebView 同时处理触摸

    Problem 从 iOS 13 4 开始 WebKit 会拦截之前传递给系统的手势 并可以通过UIGestureRecognizer同时地 演示项目 我创建WKWebView并将其添加到UIViewController的观点 我也创建了U