oh my god
今天死在scrollToItemAtIndexPath: atScrollPosition: animated:方法上面,scrollPosition這個參數控制cell具體停留在上下左右中到底哪個位置,看了API有7個枚舉值
UICollectionViewScrollPositionNone = 0, // The vertical positions are mutually exclusive to each other, but are bitwise or-able with the horizontal scroll positions. // Combining positions from the same grouping (horizontal or vertical) will result in an NSInvalidArgumentException. UICollectionViewScrollPositionTop = 1 << 0, UICollectionViewScrollPositionCenteredVertically = 1 << 1, UICollectionViewScrollPositionBottom = 1 << 2, // Likewise, the horizontal positions are mutually exclusive to each other. UICollectionViewScrollPositionLeft = 1 << 3, UICollectionViewScrollPositionCenteredHorizontally = 1 << 4, UICollectionViewScrollPositionRight = 1 << 5
之前沒有去理解過它幾個參數的意思,要實現在二級界面通過indexPath獲取到一級界面的collectionView的對應位置的cell
UIView *sourceCell = [_sourceView cellForItemAtIndexPath:indexPath]; if (!sourceCell) { [_sourceView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO]; [_sourceView layoutIfNeeded]; sourceCell = [_sourceView cellForItemAtIndexPath:indexPath]; }
此時cell存在nil的情況,collectionView.visibleCells沒有這個cell,需要從重用池獲取,所以要滾動到這個cell位置后走layoutSubViews布局,這樣才拿的到cell
在給參數時給了 UICollectionViewScrollPositionLeft ,然后pop回去就一直沒效果,用了代理 block都還是不行,以為是layoutIfNeeded的問題搞了很久。
最后 給 UICollectionViewScrollPositionCenteredVertically 這個就成了。
根據API的解釋 分成水平滾動和垂直滾動
可以想象的是當collectionView水平滾動時cell的定點相對於整個collectionView的左中右位置
當垂直滾動時cell的定點相對於整個collectionView的上中下位置
