Swift中如何让UITapGestureRecognizer仅响应单击不触发双击?
解决方案
核心思路是让你的单击手势识别器等待地图自带的双击手势识别失败后再触发,这样双击时地图的缩放逻辑优先生效,单击手势不会被误触发,完全不需要额外编写双击处理代码。
具体实现代码
let tapTap = UITapGestureRecognizer(target: self, action: #selector(getObjectProperties)) tapTap.numberOfTapsRequired = 1 tapTap.delegate = self mapView.addGestureRecognizer(tapTap) // 定位地图自带的双击手势识别器 if let doubleTapGesture = mapView.gestureRecognizers?.first(where: { guard let tapGesture = $0 as? UITapGestureRecognizer else { return false } return tapGesture.numberOfTapsRequired == 2 }) { // 设置依赖:仅当双击手势识别失败时,才触发单击手势 tapTap.require(toFail: doubleTapGesture) }
原理说明
require(toFail:) 是UIGestureRecognizer的原生API,它会让当前手势(单击)进入等待状态:只有当传入的手势(地图双击)识别失败(即用户只完成了一次点击),当前手势才会触发回调。这样既保留了地图原生的双击缩放功能,又彻底避免了双击时误触发单击逻辑的问题。
内容的提问来源于stack exchange,提问作者user18624814
相关产品推荐
相关产品推荐

