自定义UIGestureRecognizer用于双指手势

时间:2018-02-17 13:26:32

标签: ios swift uigesturerecognizer

我有一个自定义的UIGestureRecognizer用于双指手势,除了它非常挑剔关于手指如何同时触摸iOS设备以便touchesBegan通过2次触摸调用时非常挑剔。 touchesBegan通常仅使用一次Touch即可调用,即使我尝试使用两根手指。

是否有任何方法可以确定触摸次数对于如何同时将手指放在触摸屏上更加宽容?

我注意到,即使您先握住第一根手指,然后再按住另一根手指,同时仍按住第一根手指,即可识别出两根手指敲击。

以下是我的touchesBegan功能的代码:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {

      if touches.count != 2 {
         state = .failed
         return
      }

      // Capture the first touch and store some information about it.
      if trackedTouch == nil {
         trackedTouch = touches.min { $0.location(in: self.view?.window).x < $1.location(in: self.view?.window).x }
         strokePhase = .topSwipeStarted
         topSwipeStartPoint = (trackedTouch?.location(in: view?.window))!
         // Ignore the other touch that had a larger x-value
         for touch in touches {
            if touch != trackedTouch {
               ignore(touch, for: event)
            }
         }
      }
   }

5 个答案:

答案 0 :(得分:1)

如果最终状态不包含两个手指,请不要担心touchesBegan:withEvent:使用touchesEnded:withEvent:touchesMoved:withEvent:,请将其设置为.failed,否则将其设为.ended

同时用多个手指点击屏幕是不可能的,所以在touchesMoved:withEvent:期间你会发现两根手指。我不确定touchesEnded:withEvent:这个可能不会起作用,因为同时移开两根手指就像同时使用两根手指一样难,但值得一试看看它是怎么回事反应。

答案 1 :(得分:1)

对于双指手势,public class TwoFingerGestureRecognizer: UIGestureRecognizer { private var trackedTouches: Set<UITouch> = [] public override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) { for touch in touches { if self.trackedTouches.count < 2 { self.trackedTouches.insert(touch) } else { self.ignore(touch, for: event) } } if self.trackedTouches.count == 2 { // put your current logic here } } public override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) { } public override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) { self.trackedTouches.subtract(touches) } public override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent) { self.trackedTouches.subtract(touches) } public override func reset() { super.reset() self.trackedTouches = [] } } 最有可能被调用两次:一旦你将第一根手指放在屏幕上,一次放在第二根手指上。

在您保留的状态下,您应该跟踪两个触摸(或者就此而言,所有当前触摸),并且只有在收到两个触摸并且手势为&#39时才启动手势; s的起始条件已经满足。

sum(boot_qt, boot_y)

答案 2 :(得分:1)

我建议您让代码更宽容一些。虽然touchesBegan / Moved / Ended / Cancelled响应“一个或多个触摸”的事件(如Apple docs中所述),依靠用户的精确度同时用2个手指触摸屏幕并不理想。假设您启用了多点触控,这听起来就像您一样。

当你收集的触摸达到2时,尝试自己跟踪触摸并执行你的逻辑。显然你还必须跟踪你的触摸量何时变得更多或更少并相应地处理事情,但我猜你呢如果你的手势只是用于2个手指(除了你必须在touchesBegan中添加的额外逻辑),我已经处理了这个。

答案 3 :(得分:0)

不确定为什么其他人回答使用touchesMoved:withEvent没有回答你的问题,但也许你需要一个github示例。

Double touch move example.

答案 4 :(得分:-1)

touchesMoved是一个选项,以便您实现愿望的结果?此外,您可以在将状态设置为失败之前实施计数器 不要忘记设置 isMultipleTouchEnabled = true

  override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    if touches.count != 2 {
        print("we do NOT have two touches")
        if counter > 100   { // 100 "more fogiven"
            state = .failed
        }
        counter += 1
        return
    } else {
        print("we have to two touches")
    }