有關UICollectionViewFlowLout的最經典例子,莫過于瀑布流的布局:
對于UICollectionView的處理都比較簡單,眾所周知的各種炫酷的效果,對于CollectionView功不可沒,下面就以自己所理解的來淺聊一下它;
重點分為2種情況,根據本人做過的效果:
第一種情況:類似瀑布流的布局,核心就在下面的2個系統方法中:
-(void)prepareLayout{
}
解釋下這個方法:這個方法只要FlowLayout的布局發生變化,就會調用,常用來設置如:
大部分cell的frame屬性等。
注意:其中的CollectionView的contentSize是根據itemSize動態計算出來的,不能寫死
// 當出現當前的布局對象時,返回當前的以及之前的所有屬性數組,(注意:一旦計算完畢,所有的屬性會被緩存,不會再被計算)
-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect {
return self.layoutAttributesArray;
}
以上2個方法用來布局瀑布流的情況所用:code詳見地址:https://github.com/zxwIsCode/WaterFull-
第二種情況為:如蘋果iOS9之后的手機相冊的效果:
處理它的一些方法為:常用為以下3個:
1.是否支持手動改變布局
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)oldBounds
{
return YES;
}
2.同上一種情況的設計
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{
}
3.處理item之間滑動的動畫(控制Frame的變化)
- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity {
}
code后續會給出地址:
二者的區別點在于:
當界面的設計如瀑布流特點:所有的frame都不是太固定,需要當前的frame依靠上一個item的frame設計時,采用第一種情況,
當界面中如蘋果相冊的只有最中間的frame需要特殊處理,如尺寸放大縮小,位置發生變化等,需要采用第二種情況設計
綜上為對UICollectionViewFlowLayout的理解與使用
附上大牛參考資料:
http://www.lxweimin.com/p/40868928a1cf
http://www.lxweimin.com/p/83f2d6ac7e68