天天看點

UITapGestureRecognizer 和touches事件

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));
}
           
iOS