2014-07-05 12 views
7

Sto utilizzando un UIScrollView nella mia app e utilizzo il metodo scrollviewDidScroll per spostare altre visualizzazioni che non si trovano all'interno della visualizzazione pergamena. Questo comportamento dovrebbe verificarsi solo quando l'utente sta effettivamente spostando la scrollview con un dito e non quando termina l'evento touch.UiScrollview scrollviewDidScroll rileva il tocco dell'utente

Attualmente sto usando la proprietà dragging del ScrollView per ottenere questo comportamento, ma ha un problema: quando l'utente swipes sul ScrollView e la tocca di nuovo prima di fermarsi decelerare, la proprietà dragging non è vero, anche se l'utente sta trascinando la scrollview con un dito.

+0

Cerca in 'UIGestureRecognizerState' della tua tabellaView, come' yourTableView.panGestureRecognizer.state'. Rivelerà quale è esattamente lo stato del tocco dell'utente. Fatelo in 'scrollViewDidScroll'. – n00bProgrammer

+1

Fatto. Con il codice di esempio – n00bProgrammer

risposta

19

UIScrollView ha una proprietà panGestureRecogniser, che tiene traccia dei movimenti di panoramica nella vista di scorrimento. Potete seguire la state del gesto teglia in scrollViewDidScroll per sapere esattamente in quale stato il panning è.

Swift 4,0

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    if scrollView.isEqual(yourScrollView) { 
     switch scrollView.panGestureRecognizer.state { 
      case .began: 
       // User began dragging 
       print("began") 
      case .changed: 
       // User is currently dragging the scroll view 
       print("changed") 
      case .possible: 
       // The scroll view scrolling but the user is no longer touching the scrollview (table is decelerating) 
       print("possible") 
      default: 
       break 
     } 
    } 
} 

Objective-C

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 

    if ([scrollView isEqual:yourScrollView]) { 

     switch (scrollView.panGestureRecognizer.state) { 

      case UIGestureRecognizerStateBegan: 

       // User began dragging 
       break; 

      case UIGestureRecognizerStateChanged: 

       // User is currently dragging the scroll view 
       break; 

      case UIGestureRecognizerStatePossible: 

       // The scroll view scrolling but the user is no longer touching the scrollview (table is decelerating) 
       break; 

      default: 
       break; 
     } 
    } 
} 
1

IMO la risposta migliore è l'uso di UIScrollViewDelegate, ci sono le seguenti notifiche:

// called on start of dragging (may require some time and or distance to move) 
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView; 
// called on finger up if the user dragged. velocity is in points/millisecond. targetContentOffset may be changed to adjust where the scroll view comes to rest 
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset NS_AVAILABLE_IOS(5_0); 
// called on finger up if the user dragged. decelerate is true if it will continue moving afterwards 
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate; 
+0

Avrai anche bisogno di ascoltare 'scrollViewDidScrollToTop'. – kelin

+0

@kelin in che modo questo si riferisce al tocco dell'utente? –

+0

Questo evento viene richiamato quando l'utente tocca due volte la barra di stato. Ciò fa sì che la vista tabella scorra in alto. Maggiori informazioni nella documentazione 'UIScrollViewDelegate'. – kelin

Problemi correlati