Одна вещь, которую нужно запомнить ... Вы можете получить несколько касаний, которые имеют несколько нажатий. Не забудьте учесть tapCount.
Однако, если у вас все еще есть проблема, вы можете рассмотреть все прикосновения к событию, хотя оно представляет некоторые другие проблемы управления ...
HACK ALERT
Я кодировал следующее HACK , чтобы обойти это. Иногда touchesEnded не вызывается, НО, касания появляются как часть всех касаний в событии.
Обратите внимание, что теперь вы можете обрабатывать одно и то же "отмененное" или "законченное" касание несколько раз. Если это проблема, вы должны сохранить собственное состояние «ожидающих» касаний и удалить их, когда закончите.
Да, все довольно плохо, но я не знаю, как преодолеть эту проблему без подобного взлома. Основное решение состоит в том, чтобы посмотреть на все прикосновения в каждом событии и обработать их в зависимости от их фазы, вызывая соответствующие завершенные / отмененные, когда они видны.
- (void) touchesEndedOrCancelled:(NSSet *)touches
{
__block NSMutableSet *ended = nil;
__block NSMutableSet *canceled = nil;
[touches enumerateObjectsUsingBlock:^(UITouch *touch, BOOL *stop) {
if (touch.phase == UITouchPhaseEnded) {
if (!ended) ended = [NSSet setWithObject:touch];
else [ended addObject:touch];
} else if (touch.phase == UITouchPhaseCancelled) {
if (!canceled) canceled = [NSSet setWithObject:touch];
else [canceled addObject:touch];
}
}];
if (ended) [self touchesEnded:ended withEvent:nil];
if (canceled) [self touchesCancelled:canceled withEvent:nil];
}
Затем вызовите его в конце касания Начал и коснулся Перемещено ...
[self touchesEndedOrCancelled:event.allTouches];
Чтобы это работало, touchesEnded / Cancelled не должно подавляться нулевым событием. Кроме того, «другое» должно быть обработано. В касаниях закругленный ...
[self touchesCancelled:[event.allTouches objectsPassingTest:^BOOL(UITouch *touch, BOOL *stop) {
return touch.phase == UITouchPhaseCancelled;
}] withEvent:nil];
и в касаниях Отменено ...
[self touchesEnded:[event.allTouches objectsPassingTest:^BOOL(UITouch *touch, BOOL *stop) {
return touch.phase == UITouchPhaseEnded;
}] withEvent:nil];