iOS Swift开发如何通过手势识别器获取触摸手指数量
iOS Swift 获取触摸手指数量实现多指交互
基于原生触摸事件方法实现
你现有的代码存在逻辑顺序问题:先强制解包touches.first再做非空判断,会在touches为空时触发闪退。直接取touches集合的count属性即可获得当前触摸的手指数量,修正后代码如下:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { // 先做安全判空,避免闪退 guard !touches.isEmpty else { return } // 当前触摸的手指数量 let fingerCount = touches.count // 双指触摸逻辑处理 if fingerCount == 2 { // 转成数组即可获取每个触摸点的位置 let touchArray = Array(touches) let point1 = touchArray[0].location(in: view) let point2 = touchArray[1].location(in: view) // 后续可基于两个点的坐标计算位移、距离、角度等数值 } } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { guard !touches.isEmpty else { return } let fingerCount = touches.count if fingerCount == 2 { let touchArray = Array(touches) let loc1 = touchArray[0].location(in: view) let loc2 = touchArray[1].location(in: view) // 示例:计算双指中心点、间距 let center = CGPoint(x: (loc1.x + loc2.x)/2, y: (loc1.y + loc2.y)/2) let distance = sqrt(pow(loc1.x - loc2.x, 2) + pow(loc1.y - loc2.y, 2)) } }
基于手势识别器实现(更推荐)
如果仅需实现常规多指交互,优先使用系统内置的手势识别器,不需要自行处理触摸事件的全生命周期逻辑,还能避免很多边缘case问题。
以双指拖动手势为例,代码示例如下:
// 视图初始化或viewDidLoad中添加手势 let doubleFingerPan = UIPanGestureRecognizer(target: self, action: #selector(panHandler(_:))) // 限制仅识别双指操作 doubleFingerPan.minimumNumberOfTouches = 2 doubleFingerPan.maximumNumberOfTouches = 2 // 如果需要同时触发原生touches系列方法,添加下面这行配置 // doubleFingerPan.cancelsTouchesInView = false view.addGestureRecognizer(doubleFingerPan) // 手势回调方法 @objc func panHandler(_ gesture: UIPanGestureRecognizer) { // 直接获取当前触摸的手指数量 let fingerCount = gesture.numberOfTouches guard fingerCount == 2 else { return } // 获取两个手指的位置 let point1 = gesture.location(ofTouch: 0, in: view) let point2 = gesture.location(ofTouch: 1, in: view) // 获取拖动的偏移量 let translation = gesture.translation(in: view) switch gesture.state { case .began: // 双指触摸开始逻辑 case .changed: // 双指拖动过程逻辑 case .ended, .cancelled: // 双指触摸结束逻辑 default: break } }
如果是要实现双指缩放、双指旋转效果,可直接使用系统封装的UIPinchGestureRecognizer、UIRotationGestureRecognizer,不需要自行计算间距、角度数值,直接读取对应类的scale、rotation属性即可。
内容的提问来源于stack exchange,提问作者x001017
相关产品推荐
相关产品推荐

