記一次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地址下載