//cancelsTouchesInView 默认为YES;//delaysTouchesBegan 默认为NO;
UITapGestureRecognizer *CMGC_tapGes = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(CMGC_ddd)];CMGC_tapGes.numberOfTapsRequired = 3;CMGC_tapGes.cancelsTouchesInView = YES;CMGC_tapGes.delaysTouchesBegan = YES;[self addGestureRecognizer:CMGC_tapGes];
连续点击3次
cancelsTouchesInView:YES delaysTouchesBegan:NO
调用一次**-touchesBegan:withEvent:;一次-****touchesCancelled:**(NSSet<UITouch *> *)touches withEvent:,touches中包含三次点击;一次-CMGC_ddd
cancelsTouchesInView:YES delaysTouchesBegan:YES
调用一次-CMGC_ddd
cancelsTouchesInView:NO delaysTouchesBegan:YES
调用一次-CMGC_ddd
cancelsTouchesInView:NO delaysTouchesBegan:NO
调用一次-touchesBegan:withEvent:,调用一次-CMGC_ddd
UITapGestureRecognizer *CMGC_tapGes = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(CMGC_ddd)];
CMGC_tapGes.numberOfTapsRequired = 1;
CMGC_tapGes.cancelsTouchesInView = YES;CMGC_tapGes.delaysTouchesBegan = YES;
[self addGestureRecognizer:CMGC_tapGes];
点击1次
cancelsTouchesInView:YES delaysTouchesBegan:NO
****调用一次-CMGC_ddd
cancelsTouchesInView:YES delaysTouchesBegan:YES
调用一次-CMGC_ddd
cancelsTouchesInView:NO delaysTouchesBegan:YES
调用一次-CMGC_ddd
cancelsTouchesInView:NO delaysTouchesBegan:NO
****调用一次-CMGC_ddd,调用一次-touchesBegan:withEvent:
cancelsTouchesInView或delaysTouchesBegan其中有一个为YES则在识别器识别到手势时阻断**-touchesBegan:withEvent:方法,但是如果识别器所需点击次数超过1次时,会在第一次点击时调用一次****touchesBegan:withEvent:方法。**
如果cancelsTouchesInView为yes,并且识别器所需点击次数超过1次时,会调用一次-****touchesCancelled:(NSSet<UITouch *> *)touches withEvent:,touches中包含全部的点击。
UIGestureRecognizerDelegate 代理方法
在手势识别器尝试从UIGestureRecognizerStatePossible转换的时候调用。返回NO导致它切换为UIGestureRecognizerStateFailed
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;
当gestureRecognizer或者otherGestureRecognizer中的任何一个被另外一个阻塞时调用。返回YES使两个识别器同时响应。默认实现返回NO(默认两个识别器不能同时响应)
注意:返回YES保证可以同步识别。返回NO不能保证阻止同时识别,因为另一个代理可能返回YES
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
每次尝试识别的时候调用一次,所以失败的依赖可以延时确定,并且可能在跨视图层次结构的识别器之间建立
返回YES来在gestureRecognizer和otherGestureRecognizer之间设置动态失败依赖
注意:返回YES保证可以设置失败依赖。返回NO不能保证没有失败依赖,因为另一个代理可能返回YES
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer API_AVAILABLE(ios(7.0));
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer API_AVAILABLE(ios(7.0));
手势识别器在调用touchesBegan:withEvent:之前为了新的touch调用。返回NO来禁止识别器识别这个触摸
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
****在 pressesBegan:withEvent: 调用前为了一个新的按压访问gesture recognizer
返回NO禁止gesture recognizer识别这个按压
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceivePress:(UIPress *)press;
在-gestureRecognizer:shouldReceiveTouch:或者-gestureRecognizer:shouldReceivePress:之前调用一次
返回NO禁止手势识别器识别这个时间
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveEvent:(UIEvent *)event API_AVAILABLE(ios(13.4), tvos(13.4)) API_UNAVAILABLE(watchos);
如果要实现嵌套scrollView联动,通过UIGestureRecognizerDelegate存在困难,因为不好控制滑动过程中
滑动在两个scrollView之间传递。