2012-12-26 10 views
18

Ho fatto abbastanza google, & Ho controllato post come questi (Finding the direction of scrolling in a UIScrollView?) in stackoverflow prima di pubblicarlo. Ho un numero dinamico di foto in un'app per iPhone, che viene visualizzata tramite UIScrollView. In qualsiasi momento, sono visualizzate solo 3 foto nella vista a scorrimento. Quando ho, diciamo 4 fotografie, in totale: prima foto: visualizzate all'offset 0.0 seconda foto: visualizzate all'offset 320,0 3 ° foto: visualizzate all'offset 640,0Rileva la direzione di UIScrollView scorri in scrollViewWillBeginDragging

Ora, quando l'utente scorre al 4 foto, la vista a scorrimento viene reimpostata su 0.0 offset. Se l'utente tenta di scorrere "oltre" la quarta foto, lo scorrimento dovrebbe fermarsi solo nella direzione destra (in modo che l'utente non scorra "oltre"). Ma attualmente, l'utente 'è in grado' di scorrere oltre l'ultima foto; tuttavia, rilevo questo programmaticamente & ripristinando l'offset. Ma non sembra accurato, poiché l'utente vede momentaneamente lo sfondo nero. Voglio rilevare che l'utente ha iniziato a scorrere 'a destra' (ricordare, scorrere 'a sinistra', cioè alla foto 'precedente' è okay) in scrollViewWillBeginDragging, in modo da poter interrompere ulteriormente lo scorrimento verso destra.

Quello che ho cercato: (!)

  1. Cercando utilizzando self.scrollView.panGestureRecognizer s' translationInView non funziona, perché non c'è panGestureRecognizer istanza restituita in primo luogo, anche se l'API UIScrollView sostiene così.
  2. Rilevare questo in scrollViewDidEndDecelerating è possibile, anche se non sarà al mio servizio.

risposta

6

Grazie, Kris. Questo è ciò che ha funzionato per me, finalmente:

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

Potrebbe illustrare lastContentOffset – Daniel

+1

@Daniel è necessario salvare l'ultimo "offset di contenuto", che è il precedente contentOffset dall'ultima chiamata a questo metodo. Non so perché Jean l'abbia dimenticato. Basta aggiungere lastContentOffset come variabile statica nella parte superiore, quindi impostarlo alla fine del metodo. La traduzione –

0

Dai uno sguardo allo scrollViewWillEndDragging:withVelocity:targetContentOffset:. È possibile utilizzare tale metodo per fare qualsiasi controllo e vedere se sta andando dove non dovrebbe e quindi nel metodo è possibile impostare un nuovo targetContentOffset.

Per the documentation:

Questo metodo non viene chiamato quando il valore della proprietà pagingEnabled della vista di scorrimento è SI. L'applicazione può modificare il valore del parametro targetContentOffset per regolare dove termina la sua animazione a scorrimento.

5

Questo è quello che ho usato e funziona bene, almeno su iOS 6.0:

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

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

consente di risparmiare il variabile di istanza per lastContentOffset ...

27

ho avuto problemi determinanti direzione in scrollViewWillBeginDragging durante il controllo della vista di scorrimento 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 
    } 
} 

L'ho trovato molto utile per cancellare una pergamena al primo movimento di trascinamento quando l'utente sta trascinando in una direzione proibita.

+1

sembra sempre zero (almeno in iOS7.1) La traduzione –

+1

a volte sarà zero, quindi questo tipo di 'kindof' funziona (iOS 8.3) – wbarksdale

+0

usa 'scrollViewDidScroll' invece –

0

scrollView.panGestureRecognizer translationInView:scrollView non segnala nulla di utile in scrollViewWillBeginDragging in iOS 7.

Questo fa:

Nel @interface

BOOL scrollDirectionDetermined; 

e:

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

e:

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

Sembra che ci siano problemi con il rilevamento di base direzione di scorrimento d sulla traduzione del riconoscimento pan del scrollView in iOS 7+. Questo sembra funzionare abbastanza senza soluzione di continuità per i miei scopi

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

per SWIFT 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

Swift 3 Soluzione

1- Aggiungere UIScrollViewDelegate

2 - Aggiungi questo codice

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

Costruzione off di risposta di @ Oscar, si possono fare cose come

scrollView.bounces = actualPosition.y < 0 se si desidera che lo ScrollView a rimbalzare quando si scorre verso il basso, ma non quando si scorre verso l'alto

Problemi correlati