iPhone - конфликты с несколькими UIGestureRecognizer - PullRequest
5 голосов
/ 26 октября 2010

У меня в настоящее время есть некоторые конфликты с UIGestureRecognizer, из-за которых все хорошо сочетается друг с другом.У меня есть несколько квадратов (UIView) на экране, которые позволяют пользователю панорамировать и сжимать (используется для масштабирования видов).У меня есть UIPinchGestureRecognizer, добавленный к основному виду, к которому добавляются квадраты, чтобы я мог масштабировать квадрат в фокусе.Я также добавил UIPanGestureRecognizer в каждый квадрат, чтобы его можно было перемещать по экрану.Проблема проявляется, когда я зажимаю, чтобы масштабировать выбранный квадрат, когда мои пальцы перемещаются по остальным.Основываясь на моей отладке, кажется, что, если мои зажимающие пальцы проходят через не сфокусированные квадраты, они съедают прикосновения, которые отменяют жест зажимания.Использование «[pan requireGestureRecognizerToFail: pinch]» дает приоритет сжатия, но создает и выпускает, потому что распознаватель непрерывного панорамирования больше не срабатывает.Я также попытался добавить UIPinchRecognizer непосредственно к квадрату, но это работает, но жест имеет ограничение нахождения в границах квадрата, что не работает, если квадрат слишком сильно уменьшен.Это можно обойти?Я что-то упустил?

1 Ответ

3 голосов
/ 26 октября 2010

Одним из способов решения этой проблемы было бы установить один общий делегат для всех ваших UIGestureRecognizer (вероятно, UIViewController для этого представления). Этот делегат мог бы вернуть NO для gestRecognizerShouldBegin: (UIGestureRecognizer *) gestRecognizer, если распознаватель жестов пинча находился в состояниях «Начало» или «Изменено» (то есть распознавал и обрабатывал пинч) Это должно помешать любому из распознавателей жестов панорамирования съесть прикосновения во время жеста повышения.

В файле интерфейса вам необходимо сохранить ссылку на распознаватель жестов:

@interface MyViewController : UIViewController <UIGestureRecognizerDelegate> {
  UIGestureRecognizer *pinchGestureRecognizer;
}

И в реализации убедитесь, что вы проверяете состояние распознавателя жестов, а не состояние передаваемого распознавателя жестов:

@implementation MyViewController

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
  if(pinchGestureRecognizer.state == UIGestureRecognizerStateBegan ||
     pinchGestureRecognizer.state == UIGestureRecognizerStateChanged) 
  {
    return NO;
  }
  else
  {
    return YES;
  }
}
...