2012-12-26 17 views
18

Zrobiłem wystarczająco google, & Sprawdziłem posty takie jak te (Finding the direction of scrolling in a UIScrollView?) w stackoverflow przed opublikowaniem tego. Mam dynamiczną liczbę zdjęć w aplikacji na iPhone'a, które wyświetlają się przez UIScrollView. W dowolnym momencie mam tylko 3 zdjęcia wyświetlane w widoku przewijania. Kiedy mam, powiedzmy 4 zdjęcia, w sumie: 1-ty fot wyświetlane na przesunięcie 0,0 2nd zdjęcie: wyświetlany na przesunięcie 320,0 3-ty fot wyświetlane na przesunięcie 640,0Wykryj kierunek UIScrollView przewiń w scrollViewWillBeginDragging

Teraz, gdy użytkownik przewija do 4 zdjęcie, widok przewijania resetuje się do przesunięcia 0.0. Jeśli użytkownik spróbuje przewinąć "poza" czwartą fotografię, przewijanie powinno zatrzymać się tylko we właściwym kierunku (aby użytkownik nie przewijał "poza"). Ale obecnie użytkownik "jest w stanie" przewinąć poza ostatnie zdjęcie; jednak wykrywam to programowo & resetowanie przesunięcia. Ale nie wygląda schludnie, ponieważ użytkownik widzi na chwilę czarne tło. Chcę wykryć, że użytkownik zaczął przewijanie "w prawo" (pamiętaj, przewijanie "w lewo", tj. Do "poprzedniego" zdjęcia jest w porządku) w scrollViewWillBeginDragging, dzięki czemu mogę zatrzymać dalsze przewijanie w prawo.

Co próbowałem: (!)

  1. Próba korzystania self.scrollView.panGestureRecognizer „s translationInView nie działa, ponieważ nie ma panGestureRecognizer wystąpienie zwrócony w pierwszej kolejności, choć API UIScrollView tak twierdzi.
  2. Wykrywanie tego w scrollViewDidEndDecelerating jest możliwe, chociaż nie będzie to służyć mojemu celowi.

Odpowiedz

6

Dziękuję, Kris. To jest to, co pracował dla mnie, w końcu:

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

Mógłbyś rozwinąć lastContentOffset – Daniel

+1

@Daniel musisz zapisać "ostatnie przesunięcie zawartości", które jest poprzednim contentOffset od ostatniego wywołania tej metody. Nie wiem, dlaczego Jean o tym zapomniał. Po prostu dodaj lastContentOffset jako zmienną statyczną u góry, a następnie ustaw ją na końcu metody. –

0

Spójrz na scrollViewWillEndDragging:withVelocity:targetContentOffset:. Możesz użyć tej metody, wykonaj każde sprawdzenie i sprawdź, czy idzie tam, gdzie nie powinno, a następnie w metodzie możesz ustawić nową targetContentOffset.

Per the documentation:

Metoda ta nie jest wywoływana, gdy wartość widoku zwoju własności pagingEnabled brzmi TAK. Aplikacja może zmienić wartość parametru targetContentOffset, aby dostosować miejsce, w którym przewijanie kończy przewijaną animację.

5

To co kiedyś i to działa dobrze przynajmniej na iOS 6.0:

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

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

Oszczędza zmiennej instancji dla lastContentOffset ...

27

miałem żadnych problemów determinujące kierunek scrollViewWillBeginDragging podczas sprawdzania widok zwoju 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 
    } 
} 

Zauważyłem, że bardzo przydaje się do anulowania przewijania przy pierwszym ruchu przeciągania, gdy użytkownik przeciąga w niedozwolonym kierunku.

+1

tłumaczenie wydaje się zawsze zerowe (przynajmniej w iOS7.1) –

+1

tłumaczenie będzie czasem zerowe, więc ten tylko "kindof" działa (iOS 8.3) – wbarksdale

+0

użyj 'scrollViewDidScroll' zamiast –

0

scrollView.panGestureRecognizer translationInView:scrollView nie zgłasza niczego przydatnego w scrollViewWillBeginDragging w iOS 7.

to robi:

W @interface

BOOL scrollDirectionDetermined; 

oraz:

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

oraz:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 
    scrollDirectionDetermined = NO; 
} 
1

Wydaje się, że problemy z wykrywaniem kierunku przewijania podstawy d na tłumaczenie urządzenia do rozpoznawania paneli przewijania w systemie iOS 7+. To wydaje się działać całkiem bezproblemowo do moich celów

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

do szybkiego iOS 8.0+ 2.0+ &

func scrollViewWillBeginDecelerating(scrollView: UIScrollView) { 
    let actualPosition = scrollView.panGestureRecognizer.translationInView(scrollView.superview) 
    if (actualPosition.y > 0){ 
     // Dragging down 
    }else{ 
     // Dragging up 
    } 
} 
4

Swift 3 Rozwiązanie

1- Dodaj UIScrollViewDelegate

2 - Dodaj ten kod:

func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) { 
    let actualPosition = scrollView.panGestureRecognizer.translation(in: scrollView.superview) 
    if (actualPosition.y > 0){ 
     // Dragging down 
    }else{ 
     // Dragging up 
    } 
} 
0

budynku off odpowiedzi @ Oscar, można robić takie rzeczy jak

scrollView.bounces = actualPosition.y < 0 jeśli chcesz Scrollview odbić podczas przewijania do dołu, ale nie podczas przewijania do góry