cancelsTouchesInView与delaysTouchesBegan

1,256 阅读2分钟
//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之间传递。