UICollectionView:如何检测滚动停止
我正在使用UICollectionView
快速滚动一组缩略图。 一旦滚动结束,我想显示一个更大的高分辨率版本的当前缩略图。
如何检测用户何时完成滚动? 我确实实现了didEndDisplayingCell
,但是这只能告诉我某个特定的单元格是否已经滚动; 它不会告诉我滚动动作何时完成。
NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionView : UIScrollView
UICollectionView
是UIScrollView
的子类。 所以如果你已经设置了委托并实现了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 // ... }