web-dev-qa-db-fra.com

UICollectionView: comment détecter l'arrêt du défilement

J'utilise une UICollectionView pour faire défiler rapidement un ensemble de vignettes. Une fois le défilement terminé, j'aimerais afficher une version plus grande de la vignette actuelle en haute résolution. 

Comment puis-je détecter que l'utilisateur a terminé le défilement? J'implémente didEndDisplayingCell, mais cela ne me dit que quand une cellule particulière s'est éteinte; cela ne me dit pas quand le mouvement de défilement se termine réellement.

51
George Armhold
NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionView : UIScrollView

UICollectionView est une sous-classe de UIScrollView. Ainsi, si vous avez défini le délégué et implémenté UIScrollViewDelegate, vous devriez pouvoir le détecter de la même manière que UIScrollView.

Pour par exemple: - 

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

Comme indiqué dans documentation , la méthode ci-dessus devrait indiquer quand la vue de défilement a fini de ralentir le mouvement de défilement.

112
iDev

Juste pour couvrir vos bases, vous devez implémenter ces deux méthodes UIScrollViewDelegate . Dans certains cas, il peut ne pas y avoir de décélération (et scrollViewDidEndDecelerating ne sera pas appelé), par exemple, la page est entièrement défilée sur place. Dans ce cas, faites votre mise à jour là-bas dans scrollViewDidEndDragging.

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

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
  [self updateStuff];
}
51
Abey M

Un fait important à noter ici: 

Cette méthode est appelée sur les parchemins initiés par l’utilisateur (par exemple, un geste de panoramique).

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

Par contre, celui-ci est appelé pour tous les parchemins lancés manuellement (par programme) (comme scrollRectToVisible ou scrollToItemAtIndexPath)

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
30
D6mi

Swift 3 version:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    // Your code here
}
8
Mr Stanev

Version rapide 3 des réponses d'Abey M et D6mi:

Lorsque le défilement est provoqué par une action de l'utilisateur

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")
}

Lorsque le défilement est provoqué par une action de code (par programme): (comme "scrollRectToVisible" ou "scrollToItemAtIndexPath")

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

Remarques:

  • Placez ces fonctions dans votre délégué UIScrollViewDelegate ou UICollectionViewDelegate.
  • si vous n'avez pas de délégué distinct, faites en sorte que votre classe actuelle étende UIScrollViewDelegate en haut de votre fichier de classe.

.

open class MyClass: NSObject , UICollectionViewDelegate

et quelque part dans votre vueWillAppear faire de la classe son propre délégué

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

si vous voulez utiliser l'indexpath visible:

- (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];
    }
}
0
Ofir Malachi