記一次UICollectionView中visibleCells的坑

記一次UICollectionView中visibleCells的坑


項目的要求是這樣的git

其實也是一個輪播圖,而已,因此依照輪播圖的實現原理,這裏以爲也很簡單,仍是利用UICollectionView,只不過自定義一個佈局可以讓cell自動吸附在最中間。github

第一個坑

在下面的數組中取出當前出如今界面可視範圍內的NSIndexPath,數組

NSArray *arr = [self.TFCollectionView indexPathsForVisibleItems];

而後遍歷,取出最中間的NSIndexPath,取出他的item而後+1,就能夠進入下次循環了。可是發現取出來的是佈局

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

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

還有這樣的code

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,那這個可行嗎。可是這也又讓我遇到了第二個坑。blog

第二個坑

接下來我取出visibleCells並打印。排序

NSArray *arr = [self.TFCollectionView visibleCells];

而後遍歷,可是發現取出來的是get

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

還有這樣的it

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

相關文章
相關標籤/搜索