Objective c 自定义UIGestureRecognizer:选择器未接收UIGestureRecognizerStateStarted

Objective c 自定义UIGestureRecognizer:选择器未接收UIGestureRecognizerStateStarted,objective-c,ios,xcode,uigesturerecognizer,Objective C,Ios,Xcode,Uigesturerecognizer,我正在实现自定义UIgestureRecognitor。为简单起见,假设它识别由>1次触摸组成的手势 这是手势。m: #import "Gesture.h" #import <UIKit/UIGestureRecognizerSubclass.h> #define SHOW printf("%s %d %d %d\n", __FUNCTION__, self.state, touches.count, self.numberOfTouches) @implementation G

我正在实现自定义UIgestureRecognitor。为简单起见,假设它识别由>1次触摸组成的手势

这是手势。m:

#import "Gesture.h"
#import <UIKit/UIGestureRecognizerSubclass.h>

#define SHOW printf("%s %d %d %d\n", __FUNCTION__, self.state, touches.count, self.numberOfTouches)

@implementation Gesture

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
  SHOW;
  if (self.numberOfTouches==1) return;
  self.state = UIGestureRecognizerStateBegan;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
  SHOW;
  if (self.numberOfTouches==1) return;
  self.state = UIGestureRecognizerStateChanged;
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
  SHOW;
  if (self.numberOfTouches==1) return;
  self.state = UIGestureRecognizerStateEnded;
}
@end
这是一个输出:

-[Gesture touchesBegan:withEvent:] 0 1 1  // 1st touch began
-[Gesture touchesMoved:withEvent:] 0 1 1
-[Gesture touchesMoved:withEvent:] 0 1 1
-[Gesture touchesMoved:withEvent:] 0 1 1
-[Gesture touchesBegan:withEvent:] 0 1 2  // 2nd touch began
-[Gesture touchesMoved:withEvent:] 1 1 2  // Gesture.state==UIGestureRecognizerStateBegan but selector was not called
-[ViewController handleGesture:] 2        // UIGestureRecognizerStateChanged received.
-[Gesture touchesMoved:withEvent:] 2 2 2
-[ViewController handleGesture:] 2
-[Gesture touchesMoved:withEvent:] 2 2 2
-[ViewController handleGesture:] 2
-[Gesture touchesMoved:withEvent:] 2 2 2
-[ViewController handleGesture:] 3        // UIGestureRecognizerStateEnded received.

为什么选择器不接收UIgestureRecognitzerStateStarted?

这对我来说不是特别明显,但规则似乎是:

  • 通过
    touchsbegind:…
    发送给您的所有触摸随后被视为属于您,除非并直到您将状态设置为
    UIgestureRecognitizerStateFailed
    UIgestureRecognitizerStateEnded
    UIgestureRecognitizerStateCancelled
  • 相反,如果您切换到
    UIgestureRecognitizerStateStarted
    ,则手势识别器将启用该状态,然后当现在分配给您的触摸移动时,自动生成
    UIgestureRecognitizerStateChanged
因此,您不应该为自己设置
UIgestureRecognitizerStateChanged
——只需跟踪触摸并正确张贴开始、结束、失败和取消

在您的情况下,我认为您只需要删除
touchsmoved:…
中的状态集


(旁白:上述情况适用于iOS 5和iOS 6;在iOS 4下,行为稍显微妙。要在所有三个版本下工作,请使用类似于
的结构,如果(self.state==uigestureRecognitizerStateStarted)self.state=uigestureRecognitizerStateChanged;
当您知道您的属性已更改时)

我刚刚检查过,是的,你完全正确:注释行“self.state=uigesturecognizerstatechanged;”解决了问题!非常感谢。
-[Gesture touchesBegan:withEvent:] 0 1 1  // 1st touch began
-[Gesture touchesMoved:withEvent:] 0 1 1
-[Gesture touchesMoved:withEvent:] 0 1 1
-[Gesture touchesMoved:withEvent:] 0 1 1
-[Gesture touchesBegan:withEvent:] 0 1 2  // 2nd touch began
-[Gesture touchesMoved:withEvent:] 1 1 2  // Gesture.state==UIGestureRecognizerStateBegan but selector was not called
-[ViewController handleGesture:] 2        // UIGestureRecognizerStateChanged received.
-[Gesture touchesMoved:withEvent:] 2 2 2
-[ViewController handleGesture:] 2
-[Gesture touchesMoved:withEvent:] 2 2 2
-[ViewController handleGesture:] 2
-[Gesture touchesMoved:withEvent:] 2 2 2
-[ViewController handleGesture:] 3        // UIGestureRecognizerStateEnded received.