有关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.jianshu.com/p/40868928a1cf
http://www.jianshu.com/p/83f2d6ac7e68