Подтвердить что ты не робот

Определить направление прокрутки 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 возможно, хотя это не будет служить моей цели.
4b9b3361

Ответ 1

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

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // Detect the scroll direction
    if (lastContentOffset < (int)scrollView.contentOffset.x) {
    ...
    }
}

Ответ 2

У меня не было проблем, определяющих направление в 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
    }
}

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

Ответ 3

Для быстрых 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
    }
}

Ответ 4

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

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

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

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

Ответ 5

Решение 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
    }
}

Ответ 6

Похоже, что возникают проблемы с обнаружением направления прокрутки, основанного на переводе распознавателя панорамы 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
}

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

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