UICollectionView:如何检测滚动何时停止

时间:2013-02-14 05:19:35

标签: ios objective-c ios6 uicollectionview

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

如何检测用户何时完成滚动?我实现didEndDisplayingCell,但这只会告诉我特定单元格何时滚动;它没有告诉我滚动动作何时实际完成。

6 个答案:

答案 0 :(得分:114)

NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionView : UIScrollView

UICollectionViewUIScrollView的子类。因此,如果您设置了代理并实施了UIScrollViewDelegate,那么您应该能够像UIScrollView一样检测到这一点。

例如: -

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

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

答案 1 :(得分:52)

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

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

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

答案 2 :(得分:31)

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

此方法在用户启动的滚动(即平移手势)

上调用
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;

另一方面,在所有手动(以编程方式)启动的滚动(例如scrollRectToVisiblescrollToItemAtIndexPath

上调用此对象
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView

答案 3 :(得分:8)

Swift 3版本:

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

答案 4 :(得分:5)

Swift 3版本的Abey 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
    // ...
}

答案 5 :(得分:0)

如果你想使用可见的索引路径:

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