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.
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.
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];
}
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
Swift 3 version:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
// Your code here
}
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:
.
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
// ...
}
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];
}
}