添加自定义手势识别器的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

