Обнаружение жестов смахивания на UITableViewCell внутри UIScrollView - PullRequest
10 голосов
/ 28 сентября 2011

Я надеюсь, что кто-то сможет помочь мне с проблемой, которая сейчас решает мою проблему!

Учитывая следующую иерархию представлений

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;
}

И возвращаю НЕТ, если касаемое представление является представлением таблицыcell.

Все эти методы вызываются и выполняют свои действия, как и ожидалось, но я все еще не могу остановить UIScrollView от "перетаскивания" жеста смахивания.

Интересно то, что еслиЯ включил UIView, который содержит tableview и ячейку для обоих методов выше (один с SUBVIEW_TAG), он работает отлично, поэтому я предполагаю, что это должно быть что-тоЭто связано с тем фактом, что UITableView наследуется от UIScrollView.

Моя главная цель - иметь возможность провести по ячейке, чтобы открыть больше возможностей для ячейки.Горизонтальное перелистывание в любом месте этого представления будет захватываться представлением прокрутки и сдвигать содержимое по горизонтали в соответствии с его обычным поведением.

Любые идеи будут очень цениться!

Спасибо!Рог

Ответы [ 2 ]

3 голосов
/ 23 ноября 2015

У меня была похожая проблема с обнаружением прокрутки для компонента внутри прокрутки, и я смог решить ее с помощью

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:swipeGesture]

Где scrollView - это объект прокрутки, который действует как контейнер, а swipeGesture - этообъект жеста смахивания компонента внутри scrollview.

Таким образом, вы можете определить смахивание для объекта ячейки следующим образом (для примера смахивание вправо, настроить его как хотите)

UISwipeGestureRecognizer* rightSwipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(yourMethod)];
        [rightSwipeRecognizer setDirection:UISwipeGestureRecognizerDirectionLeft];

[cell addGestureRecognizer:rightSwipeRecognizer];

изатем выполните

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:rightSwipeRecognizer]

В документации requireGestureRecognizerToFail говорится:

Этот метод создает связь с другим распознавателем жестов, который задерживает переход получателя из UIGestureRecognizerStatePossible.Состояние, в которое переходит получатель, зависит от того, что происходит с otherGestureRecognizer:

Если otherGestureRecognizer переходит в UIGestureRecognizerStateFailed, получатель переходит в свое нормальное следующее состояние.

, если otherGestureRecognizer переходит в UIGestureRecogneSizeSignSignStateприемник переходит на UIGestureRecognizerStateFailed.

Пример, где этот метод может быть вызван, - когда вы хотите, чтобы жест с одним касанием требовал сбоя жеста с двойным касанием.

Доступность Доступно в iOS 3.2 и более поздних версиях.

Надежда помогает!

2 голосов
/ 23 ноября 2015

Решение довольно простое.Все, что вам нужно сделать, это добавить UIScrollView внутри вас UITableViewCell.Это предотвратит эффект "зависания" во время жеста смахивания.

Embedded UIScrollView

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...