Определить направление прокрутки UIScrollView в scrollViewWillBeginDragging

Я сделал google достаточно, и я сделал проверку сообщений, подобных этим (Поиск направления прокрутки в UIScrollView?) в stackoverflow перед публикацией этого. У меня есть динамическое количество фотографий в приложении iPhone, которое отображается через UIScrollView. В любой момент времени в окне прокрутки отображается только 3 фотографии. Когда у меня есть, скажем, 4 фотографии, всего: 1-я фотография: отображается со смещением 0.0 2-я фотография: отображается со смещением 320,0 Третья фотография: отображается со смещением 640.0

Теперь, когда пользователь прокручивается до 4-й фотографии, вид прокрутки сбрасывается до 0,0 смещения. Если пользователь пытается прокрутить "за" 4-ю фотографию, прокрутка должна останавливаться только вправо (чтобы пользователь не прокручивал "за" ). Но в настоящее время пользователь "может" прокручиваться за пределы последней фотографии; однако я обнаруживаю это программно и reset смещение. Но он не выглядит аккуратным, так как пользователь мгновенно видит черный фон. Я хочу обнаружить, что пользователь начал прокручивать "право" (помните, что прокрутка "влево", т.е. на "предыдущую" фотографию в порядке) в scrollViewWillBeginDragging, так что я могу остановить дальнейшую прокрутку вправо.

Что я пробовал:

  • Попытка использования self.scrollView.panGestureRecognizer translationInView не работает, потому что нет panGestureRecognizer экземпляр, возвращенный в первую очередь (!), хотя API UIScrollView утверждает это.
  • Обнаружение этого в scrollViewDidEndDecelerating возможно, хотя это не будет служить моей цели.
+17
26 дек. '12 в 14:49
источник поделиться
9 ответов

Спасибо, Крис. Это то, что сработало для меня, наконец:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // Detect the scroll direction
    if (lastContentOffset < (int)scrollView.contentOffset.x) {
    ...
    }
}
+5
27 дек. '12 в 14:01
источник

У меня не было проблем, определяющих направление в scrollViewWillBeginDragging при проверке прокрутки panGestureRecognizer:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{ 
    CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView.superview];

    if(translation.y > 0)
    {
        // react to dragging down
    } else
    {
        // react to dragging up
    }
}

Мне было очень полезно отменять прокрутку при первом перемещении перетаскивания, когда пользователь перетаскивает в запрещенном направлении.

+26
16 окт. '13 в 19:44
источник

Для быстрых 2.0+ и ios 8.0 +

func scrollViewWillBeginDecelerating(scrollView: UIScrollView) {
    let actualPosition = scrollView.panGestureRecognizer.translationInView(scrollView.superview)
    if (actualPosition.y > 0){
        // Dragging down 
    }else{
        // Dragging up
    }
}
+9
21 мар. '16 в 9:20
источник

Это то, что я использовал, и он работает, по крайней мере, на iOS 6.0:

- (void)scrollViewDidScroll:(UIScrollView*)scrollView
{
   CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView];

   // Detect direction by accessing x or y of translation
}

Сохраняет переменную экземпляра для lastContentOffset...

+5
06 июн. '13 в 14:20
источник

Решение Swift 3

1- Добавить UIScrollViewDelegate

2- Добавьте этот код

func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
    let actualPosition = scrollView.panGestureRecognizer.translation(in: scrollView.superview)
    if (actualPosition.y > 0){
        // Dragging down
    }else{
        // Dragging up
    }
}
+4
28 февр. '17 в 9:27
источник

Похоже, что возникают проблемы с обнаружением направления прокрутки, основанного на переводе распознавателя панорамы scrollView в iOS 7+. Это, кажется, работает довольно легко для моих целей

func scrollViewDidScroll(scrollView: UIScrollView) {
    if !scrollDirectionDetermined {
        let translation = scrollView.panGestureRecognizer.translationInView(self.view)
        if translation.y > 0 {
            println("UP")
            scrollDirectionDetermined = true
        }
        else if translation.y < 0 {
            println("DOWN")
            scrollDirectionDetermined = true
        }
    }
}

func scrollViewWillBeginDragging(scrollView: UIScrollView) {
    scrollDirectionDetermined = false
}

func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
    scrollDirectionDetermined = false
}
+1
22 апр. '15 в 17:36
источник

Взгляните на scrollViewWillEndDragging:withVelocity:targetContentOffset:. Вы можете использовать этот метод, чтобы сделать какую-либо проверку и посмотреть, идет ли она туда, где она не должна, а затем в методе вы можете установить новый targetContentOffset.

В документация:

Этот метод не вызывается, когда значением свойства pagingEnabled для прокрутки является ДА. Ваше приложение может изменить значение параметра targetContentOffset, чтобы настроить, где scrollview заканчивает свою прокручивающую анимацию.

0
26 дек. '12 в 15:07
источник

scrollView.panGestureRecognizer translationInView:scrollView не сообщает ничего полезного в scrollViewWillBeginDragging в iOS 7.

Это делает:

В @interface

BOOL scrollDirectionDetermined;

и

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (!scrollDirectionDetermined) {
        if ([scrollView.panGestureRecognizer translationInView:scrollView.superview].x > 0) {
            //scrolling rightwards
        } else {
             //scrolling leftwards
       }
    scrollDirectionDetermined = YES;
    }
}

и

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    scrollDirectionDetermined = NO;
}
0
09 мая '14 в 22:18
источник

Создав ответ @Oscar, вы можете делать такие вещи, как

scrollView.bounces = actualPosition.y < 0, если вы хотите, чтобы scrollView отскакивал при прокрутке вниз, но не при прокрутке вверху

0
10 апр. '17 в 20:38
источник

Посмотрите другие вопросы по меткам или Задайте вопрос