Распознавание пролистывания двумя касаниями в UIScrollView - PullRequest
3 голосов
/ 02 июля 2011

У меня есть UIScrollView с полным экраном (iPad, 1024x768, альбомный режим).Поэтому мне нужно распознать два пальца в любом направлении над ним.Вот что у меня есть (mainScroll - свойство моего класса):

//MyViewController.h
- (void)loadView {
     mainScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];
     mainScroll.contentSize = CGSizeMake(1024*pageNumber, 768);
     mainScroll.pagingEnabled = YES;
     mainScroll.delegate = self;
     [self.view addSubview:mainScroll];

     GestureRecognizer *tapInterceptor = [[GestureRecognizer alloc] init];
     tapInterceptor.numberOfTouchesRequired = 2;
     tapInterceptor.direction = UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight;
     [mainScroll addGestureRecognizer:tapInterceptor];
     mainScroll.userInteractionEnabled = YES;
}

и

//GestureRecognizer.h
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     if ([touches count] > 1)
         NSLog(@"Started");
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
     if ([touches count] > 1)
         NSLog(@"Moved");
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
     if ([touches count] > 1)
         NSLog(@"Ended");
}

Мне пришлось добавить условие

if ([touches count] > 1)

, потому что оно работаетне только для двух (или более) касаний, но и для одного.

Но прокрутка (с двумя касаниями) все еще прокручивает мой UIScrollView.Как я могу предотвратить это?Итак, как я могу распознать пролистывание без какого-либо влияния на мой scrollView?

1 Ответ

3 голосов
/ 02 июля 2011

Документация UIGestureRecognizer дает хорошее объяснение каждого из трех следующих свойств:

cancellsTouchesInView - Если распознаватель жестов распознает его жест, он отменяет привязку оставшихся касаний этого жеста к их виду (поэтому окно их не доставит). Окно отменяет ранее доставленные касания сообщением (touchesCancelled: withEvent :). Если распознаватель жестов не распознает его жест, представление получает все касания в последовательности мультитач.

delaysTouchesBegan - До тех пор, пока распознаватель жестов при анализе событий касания не не смог распознать его жест, окно не допускает доставку объектов касания в фазе UITouchPhaseBegan к присоединенному представлению. Если распознаватель жестов впоследствии распознает его жест, представление не получает эти сенсорные объекты. Если распознаватель жестов не распознает его жест, окно доставляет эти объекты в вызове метода touchsBegan: withEvent: (и, возможно, последующего вызова touchesMoved: withEvent: для информирования его о текущем местоположении касаний).

delaysTouchesEnded - До тех пор, пока распознаватель жестов при анализе событий касания не не смог распознать его жест, окно не допускает доставку объектов касания в фазе UITouchPhaseEnded к присоединенному представлению. Если распознаватель жестов впоследствии распознает его жест, касания отменяются (в сообщении touchesCancelled: withEvent:). Если распознаватель жестов не распознает его жест, окно доставляет эти объекты в вызове touchesEnded: withEvent: method представления.

Здесь гораздо больше: UIGestureRecognizer .

Я думаю, что вам нужен либо "delaysTouchesBegan", либо "delaysTouchesEnded", чтобы представление прокрутки не получало никаких прикосновений (IE прокручивает представление) до тех пор, пока жест не провалит его требования.

...