Обнаружение жестов в UITableViewCell внутри UIScrollView
Я надеюсь, что кто-то сможет помочь мне с проблемой, которая сейчас делает мою голову!
Учитывая следующую иерархию представлений
![enter image description here]()
Я хочу, чтобы иметь возможность обнаруживать жесты салфетки в моем пользовательском UITableViewCell.
Я подклассифицировал UIScrollView и получил метод hitTest: withEvent:, который проверяет, касается ли я касания ячейки таблицы (или ее содержимого) или нет, и в этом случае я устанавливаю следующие свойства просмотра прокрутки:
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView* result = [super hitTest:point withEvent:event];
if ([result.superview isKindOfClass:[UITableViewCell class]] || [result.superview tag] == SUBVIEW_TAG)
{
self.canCancelContentTouches = NO;
self.delaysContentTouches = YES;
} else {
self.canCancelContentTouches = YES;
self.delaysContentTouches = NO;
}
return result;
}
Я также реализовал:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
if (view.tag == SUBVIEW_TAG || [[view superview] isKindOfClass:[UITableViewCell class]])
return NO;
return YES;
}
И я возвращаю NO, если рассматриваемый вид - это ячейка представления таблицы.
Все эти методы вызывают и выполняют свои действия, как ожидалось, но я все еще не могу остановить UIScrollView от "hogging" жестов салфетки.
Интересно, что если я включаю UIView, который содержит tableview и ячейку для обоих вышеперечисленных методов (тот, у которого есть SUBVIEW_TAG), он работает отлично, поэтому я предполагаю, что это должно быть связано с тем, что UITableView наследует из UIScrollView.
Моя главная цель - пронести по ячейке, чтобы показать больше возможностей для ячейки. Горизонтальное прокручивание в любом месте в этом представлении будет захватываться прокруткой и перемещать содержимое по горизонтали в соответствии с его обычным поведением.
Любые идеи были бы очень оценены!
Спасибо!
Рог
Ответы
Ответ 1
У меня была аналогичная проблема с обнаружением swipe для компонента внутри scrollview, и я смог разрешить его с помощью
[scrollView.panGestureRecognizer requireGestureRecognizerToFail:swipeGesture]
Где scrollView - это объект просмотра прокрутки, который действует как контейнер, а swipeGesture - это объект жестов для объекта в прокрутке.
Итак, вы можете определить прокрутку для объекта ячейки, подобного этому (для правильного прокрутки в примере, настраивая его, как вы хотите)
UISwipeGestureRecognizer* rightSwipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(yourMethod)];
[rightSwipeRecognizer setDirection:UISwipeGestureRecognizerDirectionLeft];
[cell addGestureRecognizer:rightSwipeRecognizer];
а затем do
[scrollView.panGestureRecognizer requireGestureRecognizerToFail:rightSwipeRecognizer]
Документация requireGestureRecognizerToFail гласит:
Этот метод создает связь с другим распознавателем жестов что задерживает переход приемников из UIGestureRecognizerStatePossible. Состояние, в котором приемник переходы в зависимости от того, что происходит с другимGestureRecognizer:
Если otherGestureRecognizer переходит на UIGestureRecognizerStateFailed, приемник переходит к нормальному следующее состояние.
если otherGestureRecognizer переходит на UIGestureRecognizerStateRecognized или UIGestureRecognizerStateBegan, приемник переходит к UIGestureRecognizerStateFailed.
Пример, когда этот метод может быть вызван, - это когда вы хотите жестов с одним касанием требует, чтобы жест двойного касания терпел неудачу.
Доступность Доступна в iOS 3.2 и более поздних версиях.
Надежда помогает!
Ответ 2
Решение довольно просто. Все, что вам нужно сделать, это добавить UIScrollView внутри, вы UITableViewCell. Это предотвратит эффект "зависания" во время жестового движения.
![Встроенный UIScrollView]()