如何获取Storyboard中UICollectionView的滚动像素值?是否可行?
当然可以实现!
这在UICollectionView的开发中是很常见的需求,下面我就给你详细讲讲具体的实现方法:
1. 先关联好代理
首先得确保你的ViewController遵守UICollectionViewDelegate协议。如果是用Storyboard搭建的界面,记得在Storyboard里把UICollectionView的delegate关联到ViewController上——按住Control键,从CollectionView拖到ViewController,然后选择「delegate」就行。
2. 记录滚动的初始位置
你需要在ViewController里定义一个变量,用来保存上一次的滚动偏移量,这样才能计算每次滚动的变化值:
// Swift版本 private var lastContentOffset: CGFloat = 0.0
// Objective-C版本 @property (nonatomic, assign) CGFloat lastContentOffset; // 在viewDidLoad里初始化:self.lastContentOffset = 0.0;
3. 监听滚动事件计算像素值
UICollectionView继承自UIScrollView,所以我们可以用UIScrollView的代理方法来监听滚动。实现scrollViewDidScroll(_:)方法,就能实时获取滚动的像素变化:
// Swift版本 func scrollViewDidScroll(_ scrollView: UIScrollView) { // 计算本次滚动的像素变化:当前偏移量减去上一次的偏移量 let scrollPixelChange = scrollView.contentOffset.y - lastContentOffset // 向下滚动时这个值是正数,向上是负数,你可以根据需求使用 print("本次滚动的像素值:\(scrollPixelChange)") // 更新上一次的偏移量,为下一次计算做准备 lastContentOffset = scrollView.contentOffset.y }
// Objective-C版本 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat scrollPixelChange = scrollView.contentOffset.y - self.lastContentOffset; NSLog(@"本次滚动的像素值:%f", scrollPixelChange); self.lastContentOffset = scrollView.contentOffset.y; }
4. 如果你要的是「单次滑动结束后的总滚动像素」
上面的方法是实时获取滚动过程中的每一次变化,如果你想拿到用户从按下手指到抬起手指这一次滑动的总滚动距离,可以用下面的方法:
// Swift版本 private var startDragOffset: CGFloat = 0.0 // 记录滑动开始时的偏移量 func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { startDragOffset = scrollView.contentOffset.y } // 滑动结束时计算总滚动距离 func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { let totalScrollPixels = scrollView.contentOffset.y - startDragOffset print("单次滑动的总滚动像素值:\(totalScrollPixels)") }
这样就能精准拿到一次完整滑动操作的滚动像素啦。
内容的提问来源于stack exchange,提问作者greatsk
相关产品推荐
相关产品推荐

