記一次UICollectionView中visibleCells的坑


記一次UICollectionView中visibleCells的坑


項目的要求是這樣的

其實也是一個輪播圖,而已,所以依照輪播圖的實現原理,這里覺得也很簡單,還是利用UICollectionView,只不過自定義一個布局能夠讓cell自動吸附在最中間。

第一個坑

在下面的數組中取出當前出現在界面可視范圍內的NSIndexPath,

NSArray *arr = [self.TFCollectionView indexPathsForVisibleItems];

然后遍歷,取出最中間的NSIndexPath,取出他的item然后+1,就可以進入下次循環了。但是發現取出來的是

打印信息是 NSLog(@"-path-:%d-:%ld-:%ld",i,(long)path.section,(long)path.item);下同

2016-07-13 14:07:32.712 TFCycleScrollView[54025:1747068] -cell-:2-:51-:0
2016-07-13 14:07:32.713 TFCycleScrollView[54025:1747068] -path-:0-:51-:0
2016-07-13 14:07:32.713 TFCycleScrollView[54025:1747068] -path-:1-:51-:0
2016-07-13 14:07:32.713 TFCycleScrollView[54025:1747068] -path-:2-:51-:0

還有這樣的

2016-07-13 14:07:30.716 TFCycleScrollView[54025:1747068] -path-:0-:50-:2
2016-07-13 14:07:30.716 TFCycleScrollView[54025:1747068] -path-:1-:50-:2
2016-07-13 14:07:30.717 TFCycleScrollView[54025:1747068] -path-:2-:50-:2

這里存在很大的坑啊,明明不一樣的數據,為什么取出來,不過還有visibleCells,那這個可行嗎。但是這也又讓我遇到了第二個坑。

第二個坑

接下來我取出visibleCells並打印。

NSArray *arr = [self.TFCollectionView visibleCells];

然后遍歷,但是發現取出來的是

2016-07-13 14:03:16.541 TFCycleScrollView[53987:1739752] -cell-:0-:50-:0
2016-07-13 14:03:16.541 TFCycleScrollView[53987:1739752] -cell-:1-:50-:2
2016-07-13 14:03:16.542 TFCycleScrollView[53987:1739752] -cell-:2-:50-:1

還有這樣的

2016-07-13 14:03:53.626 TFCycleScrollView[53999:1741433] -cell-:0-:50-:3
2016-07-13 14:03:53.626 TFCycleScrollView[53999:1741433] -cell-:1-:51-:0
2016-07-13 14:03:53.627 TFCycleScrollView[53999:1741433] -cell-:2-:50-:4	

也就是說indexPathsForVisibleItems是全部一樣的,所以這個不可取,那么取visibleCells,取出來了,但是順序又和實際的是不一樣的,所以這樣我就決定手動給排個序,然后取最中間的,這樣就能滿足需求了。

做法是這樣的:

NSArray *visibleCellIndex = [self.TFCollectionView visibleCells];
NSArray *sortedIndexPaths = [visibleCellIndex sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSIndexPath *path1 = (NSIndexPath *)[self.TFCollectionView indexPathForCell:obj1];
    NSIndexPath *path2 = (NSIndexPath *)[self.TFCollectionView indexPathForCell:obj2];
    return [path1 compare:path2];
}];

這樣返回后的數組就是排序后的數組,也是符合要去的。

Demo地址下載

參考
UICollectionView indexPathsForVisibleItems order


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM