设置UICollectionView滑动终止时的停止位置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18683985/article/details/85769719

1.以UICollectionView的父类思考

首先,UICollectionView和UITableView都拥有着UIScrollView父类.可以在UIScrollView停止滚动之后"修复"滚动位置.

如何检测UIScrollView停止滚动,详见UIScrollView及其子类停止滚动的监测.

可以在停止滚动之后修复位置.
但是效果不太好.因为UICollectionView滚动不是一种匀速的过程.

2.使用UICollectionViewFlowLayout的内部方法.

UICollectionView的创建需要一个UICollectionViewLayout的对象来进行.这个UICollecionViewLayout咱们一般使用UICollectionViewFlowLayout或者是UICollectionViewFlowLayout的子类.因为这个类帮我们处理了一些事情.

我们是通过下面的方法来实现停止定位的.

- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity

首先,如果咱们不对item的大小做变换的话,直接使用上面的方法就OK.但是如果有变换的话,我们需要重写下面的方法来获取item的布局信息然后返回出去

- (nullable NSArray<__kindof UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect

1.首先计算出item的大小,分为对item大小变换了的需要重写计算布局信息方法的和没有对item大小进行操作可以直接进入下一步两种,

2.然后调用super的这个方法得到系统默认会滚动到的地方.然后获取了loc之后调用[self layoutAttributesForElementsInRect:rect].rect为loc和self.collectionView的宽高.

3.计算隔中线的距离然后在super出的loc的距离上修复距离中线的距离就OK了.

注:第二种方法需要把UICollectionView的pagingEnabled设置为NO,pagingEnabled会在当前的基础上给你"修复"一下

下面我写的轮播图里头用到了这个,大家没事可以进去看看
样例代码

猜你喜欢

转载自blog.csdn.net/qq_18683985/article/details/85769719