Распознаватель жестов iPad — ответ с задержкой

В свое приложение я добавил новые распознаватели жестов, доступные в SDK 3.2. Кажется, все работает правильно, и время отклика на экране очень быстрое. Но по какой-то причине, когда я добавляю requireGestureRecognizerToFail к некоторым своим жестам, появляется очень заметная задержка при срабатывании жеста. Ниже приведен фрагмент кода, который я использую для создания распознавателей жестов. Кто-нибудь знает, почему есть задержка и как я могу это исправить? Я использую requireGestureRecognizerToFail, чтобы предотвратить срабатывание жеста SingleTap, когда пользователь выполняет DoubleTap.

 - (void)createGestureRecognizers {

 //Single Finger Double-Tap
 UITapGestureRecognizer *singleFingerDTap = [[UITapGestureRecognizer alloc]
            initWithTarget:self action:@selector(handleSingleDoubleTap:)];
    singleFingerDTap.numberOfTapsRequired = 2;
    [super addGestureRecognizer:singleFingerDTap];

 //Single Finger Tap
 UITapGestureRecognizer *singleFingerTap = [[UITapGestureRecognizer alloc]
              initWithTarget:self action:@selector(handleSingleTap:)];
    singleFingerTap.numberOfTapsRequired = 1;
 [singleFingerTap  requireGestureRecognizerToFail:singleFingerDTap];
 [self addGestureRecognizer:singleFingerTap];

 //Two Finger Pan
 UIPanGestureRecognizer *panGesture2 = [[UIPanGestureRecognizer alloc]
            initWithTarget:self action:@selector(handlePanGesture2:)];
    panGesture2.maximumNumberOfTouches = 2;
 [super addGestureRecognizer:panGesture2];

 //Single Finger Pan
 UIPanGestureRecognizer *panGesture1 = [[UIPanGestureRecognizer alloc]
             initWithTarget:self action:@selector(handlePanGesture1:)];
    panGesture1.maximumNumberOfTouches = 1;
 [panGesture1 requireGestureRecognizerToFail:panGesture2];
 [super addGestureRecognizer:panGesture1];

 [singleFingerDTap release];
 [singleFingerTap release];
    [panGesture1 release];
 [panGesture2 release];
}

person Maddoxx    schedule 20.06.2010    source источник
comment
Разве это не ожидаемое поведение? Если вы попросите его отложить действие до тех пор, пока другой жест не сработает, он не сможет сработать, пока это не закончится. И между двумя касаниями есть промежуток времени (нажатия != касания), поэтому вам нужно, чтобы этот промежуток времени прошел.   -  person Eiko    schedule 21.06.2010
comment
Спасибо, это имеет смысл!   -  person Maddoxx    schedule 21.06.2010


Ответы (1)


Если вы хотите различать одиночное и двойное нажатие, вы должны подождать достаточно долго, чтобы понять, что второго нажатия не будет, прежде чем вы сможете назвать это одиночным нажатием. Альтернативой может быть разработка всех ваших действий с одним нажатием таким образом, чтобы их можно было асинхронно отменить или отменить при обнаружении двойного нажатия.

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

person drawnonward    schedule 20.06.2010
comment
Теперь, когда я думаю о том, что вы сказали, становится совершенно логично, что есть задержка. Поскольку мне нужен ответ в реальном времени, мне придется вернуться к обработке событий Touch самостоятельно. Спасибо! - person Maddoxx; 21.06.2010