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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:57:02