65

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

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

4

6 回答 6

132
NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionView : UIScrollView

UICollectionView是 的子类UIScrollView。所以如果你已经设置了委托并实现了UIScrollViewDelegate,你应该能够以同样的方式检测到UIScrollView

例如:-

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

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

于 2013-02-15T23:15:13.717 回答
60

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

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

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
  [self updateStuff];
}
于 2013-10-24T18:36:46.810 回答
36

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

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

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

或在Swift中:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView)


另一方面,在所有手动(以编程方式)启动的滚动(如scrollRectToVisibleor scrollToItemAtIndexPath)上都会调用这个:

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView

或在Swift中:

func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView)

于 2015-08-18T11:25:44.053 回答
10

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 op

.

open class MyClass: NSObject , UICollectionViewDelegate

并在您 viewWillAppear 的某处使该类成为自己的代表

override open func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // ...
    self.myScrollView.delegate = self
    // ...
}
于 2017-09-12T14:20:02.977 回答
9

斯威夫特 3 版本:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    // Your code here
}
于 2017-06-20T13:49:08.337 回答
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];
    }
}
于 2017-08-27T21:57:25.053 回答