Обнаружение жестов в 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