有關(guān)UICollectionViewFlowLout的最經(jīng)典例子,莫過(guò)于瀑布流的布局:
對(duì)于UICollectionView的處理都比較簡(jiǎn)單邦投,眾所周知的各種炫酷的效果凉蜂,對(duì)于CollectionView功不可沒(méi)秀存,下面就以自己所理解的來(lái)淺聊一下它;
重點(diǎn)分為2種情況撕蔼,根據(jù)本人做過(guò)的效果:
第一種情況:類(lèi)似瀑布流的布局踏施,核心就在下面的2個(gè)系統(tǒng)方法中:
-(void)prepareLayout{
}
解釋下這個(gè)方法:這個(gè)方法只要FlowLayout的布局發(fā)生變化石蔗,就會(huì)調(diào)用,常用來(lái)設(shè)置如:
大部分cell的frame屬性等畅形。
注意:其中的CollectionView的contentSize是根據(jù)itemSize動(dòng)態(tài)計(jì)算出來(lái)的养距,不能寫(xiě)死
// 當(dāng)出現(xiàn)當(dāng)前的布局對(duì)象時(shí),返回當(dāng)前的以及之前的所有屬性數(shù)組日熬,(注意:一旦計(jì)算完畢棍厌,所有的屬性會(huì)被緩存,不會(huì)再被計(jì)算)
-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect {
return self.layoutAttributesArray;
}
以上2個(gè)方法用來(lái)布局瀑布流的情況所用:code詳見(jiàn)地址:https://github.com/zxwIsCode/WaterFull-
第二種情況為:如蘋(píng)果iOS9之后的手機(jī)相冊(cè)的效果:
處理它的一些方法為:常用為以下3個(gè):
1.是否支持手動(dòng)改變布局
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)oldBounds
{
return YES;
}
2.同上一種情況的設(shè)計(jì)
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{
}
3.處理item之間滑動(dòng)的動(dòng)畫(huà)(控制Frame的變化)
- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity {
}
code后續(xù)會(huì)給出地址:
二者的區(qū)別點(diǎn)在于:
當(dāng)界面的設(shè)計(jì)如瀑布流特點(diǎn):所有的frame都不是太固定竖席,需要當(dāng)前的frame依靠上一個(gè)item的frame設(shè)計(jì)時(shí)耘纱,采用第一種情況,
當(dāng)界面中如蘋(píng)果相冊(cè)的只有最中間的frame需要特殊處理毕荐,如尺寸放大縮小束析,位置發(fā)生變化等,需要采用第二種情況設(shè)計(jì)
綜上為對(duì)UICollectionViewFlowLayout的理解與使用
附上大牛參考資料:
http://www.reibang.com/p/40868928a1cf
http://www.reibang.com/p/83f2d6ac7e68