1. 程式人生 > >設定UICollectionView滑動終止時的停止位置

設定UICollectionView滑動終止時的停止位置

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會在當前的基礎上給你"修復"一下

下面我寫的輪播圖裡頭用到了這個,大家沒事可以進去看看
樣例程式碼