如何检测iPad触控板的触摸按下(indirectPointer)以立即停止惯性旋转动画
如何检测iPad触控板的触摸按下(indirectPointer)以立即停止惯性旋转动画
我太懂这个痛点了——触控板的触摸按下不像屏幕触摸那样能被UIPanGestureRecognizer立刻捕捉到,非得等用户稍微动一下指针才触发state.began,这就导致惯性旋转没法及时停下,体验特别别扭。下面给你几个iOS原生的解决思路,都是实战里验证过的:
用
UIPressGestureRecognizer专门捕捉触控板按下动作
触控板的按下属于间接指针按压事件,我们可以直接给3D视图添加一个UIPressGestureRecognizer,并限定它只监听间接指针的按压,这样就能在用户手指碰到触控板的瞬间触发回调,立刻停止惯性动画。代码示例如下:let pointerPressGesture = UIPressGestureRecognizer(target: self, action: #selector(handlePointerPress(_:))) // 指定只监听触控板的间接指针按压 pointerPressGesture.allowedPressTypes = [.indirectPointer] your3DModelView.addGestureRecognizer(pointerPressGesture) @objc private func handlePointerPress(_ gesture: UIPressGestureRecognizer) { if gesture.state == .began { // 在这里执行停止惯性旋转的逻辑 stopCoastingAnimation() } }结合
UIHoverGestureRecognizer做区域精准监听
如果你的3D视图只是界面的一部分,不想全局响应触控板按下,还可以搭配UIHoverGestureRecognizer先判断指针是否悬停在3D视图上方,再结合上面的按压手势,这样就能做到只有指针在目标区域时才触发停止逻辑,避免误操作。调整
UIPanGestureRecognizer的触发阈值(备选方案)
你之前用的UIPanGestureRecognizer可以试试把minimumDistance设为0(iOS 13+支持),理论上能让它在按下时就触发state.began,不过实测下来,触控板的pan手势还是会有轻微延迟,不如专门的按压手势靠谱,只能作为备选。
要注意这些方案都要求iOS 13及以上版本,毕竟iPad的触控板支持是从iOS 13开始引入的。
备注:内容来源于stack exchange,提问作者John Stephen
相关产品推荐
相关产品推荐

