Порядок множественных касаний в UIGestureRecognizer

Похоже, что нет гарантии относительно порядка, в котором появляются UITouches при циклировании через метод UIGestureRecognizer [locationOfTouch: inView:]. В частности:

for (int i = 0; i < [recognizer numberOfTouches]; i++) {
  CGPoint point = [recognizer locationOfTouch:i inView:self];
  NSLog(@"[%d]: (%.1f, %.1f)", i, point.x, point.y);
}

Можно было бы подумать, что точка с индексом 0 будет первым UITouch, или первым, который был выпущен, но довольно часто порядок в 2 касания смешивается. Кто-нибудь знает, как проверить порядок этих событий? К сожалению, нет доступа к самим объектам UITouch (с меткой времени).

Кроме того, в документации не содержится никаких гарантий, что штрихи от -locationOfTouch:inView: всегда будут в надежном порядке. Кто-нибудь может подтвердить или опровергнуть это?

Ответ 1

Вы можете попробовать установить свойство распознавателя delegate и реализовать -gestureRecognizer:shouldReceiveTouch:. Его следует называть последовательно, и вы можете затем прикоснуться к касаниям.

Ответ 2

Мне кажется, что я хочу отследить, т.е. два пальца двух рук самостоятельно, вместо того, чтобы распознавать конкретный жест, который является целью UIGestureRecognizer, как говорится в названии. Если это то, что вы хотите, я бы скорее использовал методы UIResponder:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesEnded:touches withEvent:event];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    [self touchesEnded:touches withEvent:event];
}

При таком подходе вы действительно получаете набор объектов UITouch и можете выполнять расширенное отслеживание.

Ответ 3

Почему не повторяется через UITуши, отсортированные по метке времени?