2013-02-14 19 views
41

Sto utilizzando uno UICollectionView per scorrere rapidamente una serie di miniature. Una volta terminato lo scorrimento, mi piacerebbe visualizzare una versione ad alta risoluzione più grande della miniatura corrente.UICollectionView: come rilevare quando lo scorrimento è stato interrotto

Come posso rilevare quando l'utente ha completato lo scorrimento? Attuo lo didEndDisplayingCell, ma questo mi dice solo quando una particolare cella è stata scrollata; non mi dice quando il movimento di scorrimento è effettivamente completato.

risposta

97
NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionView : UIScrollView 

UICollectionView è una sottoclasse di UIScrollView. Quindi, se hai impostato il delegato e implementato UIScrollViewDelegate, dovresti essere in grado di rilevarlo allo stesso modo di UIScrollView.

Per esempio: -

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; 

Come per documentation, il metodo di cui sopra dovrebbe dire quando la vista di scorrimento è terminato decelerare il movimento di scorrimento.

+6

brillante. Non sai quanto codice sgradevole mi abbia salvato. Stavo cercando di monitorarlo utilizzando il callback shouldInvalidateLayoutForBoundsChange nel mio UICollectionViewFlowLayout. Che n00b. –

+0

Vedere la nota di D6mi di seguito su scrollViewDidEndScrollingAnimation. scrollViewDidEndDecelerating non viene chiamato per lo scorrimento programmatico. – RajV

+1

In effetti, non capisco perché la risposta corrente sia accettata, non funziona 'scrollViewDidEndDecelerating' non viene chiamato ma come D6mi ha detto,' scrollViewDidEndScrollingAnimation' è chiamato – AkademiksQc

44

Solo per coprire le basi è necessario implementare entrambi questi metodi UIScrollViewDelegate. In alcuni casi potrebbe non esserci una decelerazione (e non verrebbe chiamato scrollViewDidEndDecelerating), ad esempio, la pagina viene completamente spostata in posizione. In tal caso, esegui il tuo aggiornamento direttamente nel numero scrollViewDidEndDragging.

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    if (!decelerate) { 
    [self updateStuff]; 
    } 
} 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    [self updateStuff]; 
} 
+6

Grazie per aver condiviso questo! Questa dovrebbe essere la risposta accettata b/c OP ha chiesto "lo scorrimento si è fermato" - senza entrambi i metodi sul posto l'utente può facilmente scorrere la vista della raccolta verso il basso e rilasciare il dito senza sfogliare e 'scrollViewDidEndDecelerating' NON viene chiamato,' scrollViewDidEndDragging' non viene chiamato . Grazie per aver postato questa risposta. –

21

Un fatto importante da notare qui:

Questo metodo viene chiamato su rotoli avviate utente (ad esempio un gesto Pan)

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; 

D'altra parte, questo viene chiamato su tutti manualmente (programatically) scorre avviato (come "scrollRectToVisible" o "scrollToItemAtIndexPath")

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView 
4

Swift 3 Versione:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
    // Your code here 
} 
+0

Grazie! Funziona bene. – Raja

0

se si desidera utilizzare l'indexpath visibile:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    [self scrollingFinish]; 
} 
- (void)scrollingFinish { 


    if([self.collectionView indexPathsForVisibleSupplementaryElementsOfKind:UICollectionElementKindSectionHeader]){ 
     NSIndexPath *firstVisibleIndexPath = [[self.collectionView indexPathsForVisibleSupplementaryElementsOfKind:UICollectionElementKindSectionHeader] firstObject]; 
     [self.collectionView scrollToItemAtIndexPath:firstVisibleIndexPath atScrollPosition:UICollectionViewScrollPositionTop animated:YES]; 
     [NSObject cancelPreviousPerformRequestsWithTarget:self]; 
    } 
} 
1

Swift 3 versione di risposte Abey M e s' D6mi:

Quando scorrimento è causato dall'utente azione

public func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { 
    if (!decelerate) { 
     //cause by user 
     print("SCROLL scrollViewDidEndDragging") 
    } 
} 

public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
    //caused by user 
    print("SCROLL scrollViewDidEndDecelerating") 
} 

Quando scorrimento è causato da un'azione di codice (di programmazione): (come "scrollRectToVisible" o "scrollT oItemAtIndexPath ")

public func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) { 
    //caused by code 
    print("SCROLL scrollViewDidEndScrollingAnimation") 
} 

Note:

  • mettere queste funzioni nel UIScrollViewDelegate o UICollectionViewDelegate delegato.
  • se non si dispone di un delegato indipendente, rendere la vostra classe corrente estendere un op superiore UIScrollViewDelegate del file di classe

.

open class MyClass: NSObject , UICollectionViewDelegate 

e da qualche parte nel vostro viewWillAppear rendere la classe proprio delegato

override open func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    // ... 
    self.myScrollView.delegate = self 
    // ... 
} 
Problemi correlati