Непрерывная прокрутка между UIPanGestureRecognizer и повторно включенным UIScrollView - PullRequest
11 голосов
/ 04 января 2012

У меня есть UIScrollView с включенной подкачкой, и я добавил к нему свой UIPanGestureRegonizer. В некоторых случаях мой контроллер представления устанавливает scrollview.scrollEnabled = NO, а затем добавляет к нему распознаватель жестов панорамирования (я не использую собственный распознаватель scrollview).

Итак, прокрутка отключена, но я жду прикосновений пользователя от моего распознавателя жестов. Когда он распознает, он вызывает свое действие, в котором я снова включаю прокрутку.

Проблема в том, что, хотя у пользователя все еще есть палец вниз, мое прокручиваемое изображение не отслеживается пальцем. Он не начинает прокручиваться, пока палец не будет поднят, а затем снова перетащен. Так что мой распознаватель жестов проглатывает все прикосновения и не передает их в просмотр прокрутки.

Я пытался переключить panGestureRecognizer.cancelsTouchesInView = NO;, но, похоже, это не дает никакого эффекта (в настоящее время я удаляю этот распознаватель, как только я снова включаю прокрутку, но если я это сделаю или нет, это не решит мою проблему ). Я также изучил delays... свойства UIGestureRecognizer, но, похоже, они тоже не помогают.

Есть идеи? Как я могу получить эти события, чтобы продолжить пересылку в мой scrollview?

1 Ответ

5 голосов
/ 25 января 2012

Ответ будет немного проще, если вы ориентируетесь только на iOS 5 и выше, потому что в этом случае вам действительно нужно повторно использовать свойство panGestureRecognizer UIScrollView.

В любом случае, ключевым шагом является НЕ повторно использовать scrollEnabled, а вместо этого создать подкласс UIScrollView, создать собственное свойство для управления этим состоянием и переопределить setContentOffset:.

    - (void) setContentOffset:(CGPoint)contentOffset
    {
        if(self.programaticScrollEnabled)
            [super setContentOffset:contentOffset];
    }

Вот одно из возможных решений для iOS 4+:

  1. Подкласс UIScrollView (или подкласс другого подкласса UIScrollView, в зависимости от ваших потребностей).
  2. Переопределите все инициализаторы, чтобы убедиться, что ваш установочный код вызывается.
  3. Объявите свойство BOOL и переопределите setContentOffset: как описано выше.
  4. В своем коде настройки установите UIPanGestureRecognizer и установите переменную состояния, чтобы разрешить программную прокрутку (при условии, что это состояние по умолчанию, которое вы хотите):

    panRecognizer = [[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)] autorelease];
    //These properties may change according to your needs
    panRecognizer.cancelsTouchesInView = NO;
    panRecognizer.delaysTouchesBegan = NO;
    panRecognizer.delaysTouchesEnded = NO;
    [self addGestureRecognizer:panRecognizer];
    panRecognizer.delegate = self;
    
    self.programaticScrollEnabled = YES;
    
  5. Управление тем, какие жесты могут происходить одновременно. В моем случае:

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
    {
        return YES;
    }
    
  6. Включите программную прокрутку обратно туда, куда вам нужно. Например:

    - (void)handleGesture:(UIPanGestureRecognizer *)gestureRecognizer
    {
        self.programaticScrollEnabled = YES;
    }
    
    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
    {
        self.programaticScrollEnabled = YES;
        return YES;
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...