Objective c 自定义UIGestureRecognizer:选择器未接收UIGestureRecognizerStateStarted
我正在实现自定义UIgestureRecognitor。为简单起见,假设它识别由>1次触摸组成的手势 这是手势。m: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
#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.