Предотвращение касаний от обработки родительским представлением таблицы
-
05-07-2019 - |
Вопрос
У меня есть настраиваемая ячейка табличного представления, которая обрабатывает жесты пользователя. Однако, даже если для меня установлено значение exclusiveTouch YES, в тот момент, когда значение y изменяется на любую величину, начинается сколлинг, даже если я нахожусь в процессе обработки событий касания. Как предотвратить прокрутку таблицы при обработке сенсорных событий в ячейке?
Решение
Таким образом, правильный способ условной обработки, к сожалению, зависит от superView. Для некоторых представлений и событий (например, UITableView select) вам нужно переслать touchesBegan: event на nextResponder, отследить ваш жест, переслать touchesMoved: события на nextResponder до тех пор, пока вы не обнаружите свой жест, и когда он сработает, вы отправите touchesCancelled: переходите к следующему ответчику и скрывайте все остальные события от следующего респондента (touchesEnded: и touchesCancelled :), пока не получите touchesEnded: или touchesCancelled: самостоятельно.
В UIScrollView, однако, есть особый случай, когда он не зависит от того, чтобы быть nextResponder для обработки событий прокрутки (прокрутка, скорее всего, обнаруживается в таких методах, как hitTest :). Поэтому независимо от того, что вы делаете в отношении пересылки или событий, прокрутка все равно происходит. Единственный способ предотвратить прокрутку - это отключить прокрутку в родительском представлении, как только ваш жест будет обнаружен, а затем снова включить прокрутку, когда она закончится или будет отменена.
Другие советы
Я думаю, что вам нужно создать подкласс UITableView и реализовать hitTest: withEvent: Вот как я сделал это для пользовательской ячейки, которую я построил для перемещения влево и вправо внутри ячейки:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
NSIndexPath *indexPath = [self indexPathForRowAtPoint:point];
UITableViewCell *cell = [self cellForRowAtIndexPath:indexPath];
if ([cell isKindOfClass:[MyCustomCell class]])
{
return cell;
}
return [super hitTest:point withEvent:event];
}