1.UICollectionView使用流水布局——UICollectionViewFlowLayout时,需要满足条件:
每个item(即cell)的大小是一样的,不仅是宽度,还有高度。这样,当collectionview的宽度发生变化时,item能将其动态填充。
itemSize即为每个cell的尺寸。
collectionview初始化时必须设置一个非空的layout。所以若想使用类似
UICollectionViewController *ctrl = [[UICollectionViewController alloc]init];
来初始化一个collectionviewcontroller,那么就需要重写它的init方法
-(id)init{
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init];
layout.itemSize = CGSizeMake(100,100);
if(self = [super initWithCollectionViewLayout:layout]){
//这里不用写内容
}
return self;
}
设置item之间的间距时,可以用以下,并且只适合UICollectionViewFlowLayout
//垂直方向间距
layout.minimumLineSpacing = 0;
//水平方向间距
layout.minimumInteritemSpacing = 0;
2.collectionview中的布局方法
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{
}
中返回值是一个数组,存放的是rect范围内所有cell的布局属性,即frame。
其中,rect是一个矩形框,它表示的是collectionview的大小位置。即定义了collectionview的大小,那么rect也是返回的该区域内的cell布局。如:
@interface LineLayout(){
UIView *_view;
}
-(NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{
//取出父类算出的布局属性
NSArray *attsArray = [super layoutAttributesForElementsInRect:rect];
if (!_view) {
UIView *view = [[UIView alloc]initWithFrame:rect];
view.backgroundColor = [UIColor orangeColor];
_view = view;
[self.collectionView addSubview:view];
}
return attsArray;
}
而collectionview的定义为
_collectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(0, 100, mScreenWidth, 300) collectionViewLayout:circle];
效果为:
当collectionview这样设置时
_collectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(0, 100, mScreenWidth/2, 300) collectionViewLayout:circle];
效果为
3.在初次使用Masonry时,若报类似
Demo-collectionviewExample[4443:172886] *** Assertion failure in -[MASViewConstraint install], /Users/Suning/Desktop/study/Demo-collectionviewExample/Pods/Masonry/Masonry/MASViewConstraint.m:345
错误,原因在于
使用Masonry为自定义view添加约束时,得先把自定义view添加到父视图上。
上图就是错误用法,将两个位置调换下即可。