1 октября 2011 г.

UIGestureRecognizer перехват одиночного касания и двойного на одном UIView

Для навешивания событий для одиночных и двойных касаний очень удобо использовать класс UIGestureRecognizer. Но если нужно перехватывать события которые пересекаются (например одиночное касание и двойное), то может возникнуть ситуация, что всегда будут выполнятся два перехваченных события (при двойном тапе будет всегда вызываться событие одиночного тапа).

В этом случае нужно запретить в UIGestureRecognizer одиночного тапа посылку события при двойном тапе. Делается просто методом - (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer.

Пример:
        UIGestureRecognizer *doubleTapGestureRecognizer = [[UIGestureRecognizer alloc]
                                initWithTarget:self action:@selector(handleDoubleTap:)];
        doubleTapGestureRecognizer.numberOfTapsRequired = 2;
        [self addGestureRecognizer:doubleTapGestureRecognizer];

        UIGestureRecognizer *singleTapGestureRecognizer = [[UIGestureRecognizer alloc]
                                                              initWithTarget:self action:@selector(handleSingleTap:)];
        singleTapGestureRecognizer.numberOfTapsRequired = 1;
        [singleTapGestureRecognizer requireGestureRecognizerToFail:doubleTapGestureRecognizer];
        [self addGestureRecognizer:singleTapGestureRecognizer];