我正在使用UICollectionView
快速滚动显示一组缩略图。滚动结束后,我想显示当前缩略图的更大的高分辨率版本。
如何检测用户何时完成滚动?我实现didEndDisplayingCell
,但这只会告诉我特定单元格何时滚动;它没有告诉我滚动动作何时实际完成。
答案 0 :(得分:114)
NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionView : UIScrollView
UICollectionView
是UIScrollView
的子类。因此,如果您设置了代理并实施了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;
另一方面,在所有手动(以编程方式)启动的滚动(例如scrollRectToVisible
或scrollToItemAtIndexPath
)
- (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")
}
注意:
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];
}
}