UICollectionView:如何检测滚动停止

我正在使用UICollectionView快速滚动一组缩略图。 一旦滚动结束,我想显示一个更大的高分辨率版本的当前缩略图。

如何检测用户何时完成滚动? 我确实实现了didEndDisplayingCell ,但是这只能告诉我某个特定的单元格是否已经滚动; 它不会告诉我滚动动作何时完成。

 NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionView : UIScrollView 

UICollectionViewUIScrollView的子类。 所以如果你已经设置了委托并实现了UIScrollViewDelegate ,你应该能够像UIScrollView一样检测这个。

例如: –

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

根据文档 ,上面的方法应该告诉滚动视图何时结束减速滚动移动。

只是为了覆盖你的基地,你应该实现这两个UIScrollViewDelegate方法。 在某些情况下,可能没有减速(并且不会调用scrollViewDidEndDecelerating ),例如,页面已完全滚动到位。 在这种情况下,在scrollViewDidEndDragging更新。

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

这里要注意一个重要的事实:

这个方法被用户启动的滚动(即一个平移手势)

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

另一方面,这个被手动调用(编程)启动的滚动(如“scrollRectToVisible”或“scrollToItemAtIndexPath”)

 - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView 

Swift 3版本:

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

如果你想使用可见的indexpath:

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

斯威夫特3版本的阿比M和D6mi的答案:

滚动是由用户操作引起的

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

当滚动是由代码行动(以编程方式):(如“scrollRectToVisible”或“scrollToItemAtIndexPath”)

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

笔记:

  • 把这些函数放在你的UIScrollViewDelegate或者UICollectionViewDelegate委托中。
  • 如果你没有一个单独的委托,让你当前的类扩展一个UIScrollViewDelegate你的类文件的顶部

 open class MyClass: NSObject , UICollectionViewDelegate 

并在你的viewWillAppear在某个地方使类自己的代表

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