UITapGestureRecognizer 的輕按兩下事件與touches事件的重合,
可運作下文代碼:列印結果是
touchesBegan:withEvent:
Recognized Double Tap:doubleTap:
touchesCancelled:withEvent:
這就是列印順序,你會發現touchesBegan touchesCancelled中間夾着Tap輕按兩下事件,如果你在 touchesBegan:withEvent:做了些操作,在View上又加了事件,這就可能造成沖突,是以,如果想不響應 touchesBegan:withEvent: 事件,需要在touches事件上設定延遲事件。
doubleTapRecognizer.delaysTouchesBegan = YES;
在運作的話,結果如下:
Recognized Double Tap:doubleTap:
這樣的話就隻運作了輕按兩下事件。
delaysTouchesBegan為NO,表示觸摸序列開始時,而手勢識别器還未識别出此手勢時,touch事件會同時發向hit-test view,這樣在手勢識别器還未識别出此手勢,hit-test view同時也可以收到同樣的觸摸事件。如果為YES,則在手勢識别器在識别手勢的過程中,不會有任何觸摸事件發送給hit-test view,如果手勢識别器最終識别到了手勢,則也不會發送任何消息(包括touchesCancelled:withEvent:)給hit-test view;若幹手勢識别最終沒有識别到手勢,則所有的觸摸事件在發給hit-test view處理。關于這個特性,可參考UIScrollView的delaysContentTouches屬性。這樣屬性也謹慎使用,使用不當會導緻UI無響應。
- (instancetype)initWithFrame:(CGRect)r
{
self = [super initWithFrame:r];
if (self) {
UITapGestureRecognizer *doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)];
doubleTapRecognizer.delaysTouchesBegan = YES;
doubleTapRecognizer.numberOfTapsRequired = 2;
[self addGestureRecognizer:doubleTapRecognizer];
}
return self;
}
- (BOOL)canBecomeFirstResponder
{
return YES;
}
- (void)doubleTap:(UITapGestureRecognizer *)gr
{
NSLog(@"Recognized Double Tap:%@",NSStringFromSelector(_cmd));
}
- (void)touchesBegan:(NSSet *)touches
withEvent:(UIEvent *)event
{
NSLog(@"%@", NSStringFromSelector(_cmd));
}
- (void)touchesMoved:(NSSet *)touches
withEvent:(UIEvent *)event
{
NSLog(@"%@", NSStringFromSelector(_cmd));
}
- (void)touchesEnded:(NSSet *)touches
withEvent:(UIEvent *)event
{
NSLog(@"%@", NSStringFromSelector(_cmd));
}
- (void)touchesCancelled:(NSSet *)touches
withEvent:(UIEvent *)event
{
NSLog(@"%@", NSStringFromSelector(_cmd));
}