Одна вещь, которую следует запомнить ... Вы можете получать касания, которые требуют нескольких нажатий. Не забудьте учесть tapCount.
Однако, если у вас все еще есть проблема, вы можете учесть все моменты, связанные с мероприятием, хотя оно представляет некоторые другие проблемы управления ...
ОПОВЕЩЕНИЕ О ВЗЛОМАХ
Чтобы обойти эту проблему, я закодировал следующий ХАК. Иногда touchEnded не вызывается, НО прикосновения отображаются как часть всех прикосновений в событии.
Обратите внимание, что теперь вы можете обрабатывать одно и то же касание «отменено» или «завершено» несколько раз. Если это проблема, вы должны сохранить свое собственное состояние «ожидающих» касаний и удалить их, когда закончите.
Да, все довольно плохо, но я не знаю, как решить эту проблему без подобного взлома. Основное решение - смотреть на все касания в каждом событии и обрабатывать их в зависимости от их фазы, вызывая соответствующие завершенные / отмененные, когда они видны.
- (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];
}
Затем вызовите его в конце TouchBegan и TouchMoved ...
[self touchesEndedOrCancelled:event.allTouches];
Для того, чтобы это сработало, touchEnded / Canceled не должно подавляться нулевым событием. Кроме того, нужно разобраться с «другим». В прикосновениях
[self touchesCancelled:[event.allTouches objectsPassingTest:^BOOL(UITouch *touch, BOOL *stop) {
return touch.phase == UITouchPhaseCancelled;
}] withEvent:nil];
и в touchCanceled ...
[self touchesEnded:[event.allTouches objectsPassingTest:^BOOL(UITouch *touch, BOOL *stop) {
return touch.phase == UITouchPhaseEnded;
}] withEvent:nil];
person
Jody Hagins
schedule
20.04.2012