You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加自定义手势识别器的WKWebView使用Apple Pencil时无响应

解决思路
  • 配置自定义手势的触摸类型支持:给自定义UIGestureRecognizer设置allowedTouchTypes = [UITouch.TouchType.pencil.rawValue, UITouch.TouchType.direct.rawValue],确保它能正确响应Apple Pencil的触摸事件,避免Pencil触摸被过滤。

  • 处理手势识别器的冲突:实现UIGestureRecognizerDelegate的gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:)方法,返回true允许自定义手势和WKWebView的内置手势(包括WKDeferringGestureRecognizer)同时识别,避免手势抢占导致状态异常。同时检查自定义手势的delaysTouchesBegan和delaysTouchesEnded属性,按需设置为false,确保触摸事件能及时传递给WebView。

  • 确保自定义手势状态正确重置:在自定义手势的reset()方法里,手动清理所有触摸状态,比如清空touches集合,确保手势结束后状态回到初始值。另外在touchesEnded(_:with:)和touchesCancelled(_:with:)方法里,强制将手势状态设置为.ended或.cancelled,避免Pencil滑动后手势卡在中间状态。

  • 调整WebView的滚动配置:如果React应用已经固定定位不需要滚动,直接禁用WKWebView的scrollView滚动:webView.scrollView.isScrollEnabled = false,这样WebView的内置滚动手势会被禁用,减少和自定义手势的冲突概率,也能避免WKDeferringGestureRecognizer因滚动状态异常出现重置失败。

  • 调试手势状态:在自定义手势的各个触摸回调方法中,打印手势的state值,同时遍历webView.scrollView.gestureRecognizers,打印每个手势的状态和类型,特别是Apple Pencil滑动后的日志,定位是否有手势卡在非结束状态,导致WebView的手势系统阻塞。

  • 临时恢复WebView响应:如果遇到WebView无响应的情况,可以尝试调用webView.scrollView.gestureRecognizers?.forEach { $0.isEnabled = false; $0.isEnabled = true },强制重置所有手势识别器的状态,恢复响应能力,同时结合错误日志排查根本原因。

内容的提问来源于stack exchange,提问作者fabian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 10:41:11