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



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

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

NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionView : UIScrollView

UICollectionViewUIScrollView的一个子类。因此,如果您已设置委托并实现UIScrollViewDelegate,您应该能够以与UIScrollView相同的方式检测到这一点。

例如:-

目标-C:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;

迅速:

func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView)
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool)

根据文档,上述方法应告知滚动视图何时结束,从而减慢滚动运动。请注意,如评论中所述,在某些情况下不会调用scrollViewDidEndDecelerating

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

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

要注意的一个重要事实。

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

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

或在 Swift 中:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView)


另一方面,这个在所有手动(编程(启动的滚动(如scrollRectToVisiblescrollToItemAtIndexPath(上被调用:

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView

或在 Swift 中:

func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView)

Abey M 和 D6mi 的 Swift 3 版本答案:

当滚动是由用户操作引起的

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

并在您视图中的某个地方出现使类成为自己的委托

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

Swift 3 版本:

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

如果要使用可见索引路径:

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

获取集合视图索引,不要忘记在类中导入UISCrollViewDelegate

public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    let xPoint = scrollView.contentOffset.x + scrollView.frame.width / 2
    let yPoint = scrollView.frame.height / 2
    let center = CGPoint(x: xPoint, y: yPoint)
    if let ip = self.collectionView.indexPathForItem(at: center) {
        pageIndex = ip.row
    }
    print(">>>>>>>>>(pageIndex)")
}

最新更新