在iOS开发流布局出来的界面很好看,但是要自定义各种各样的风格还是挺麻烦的 下面是我举了一个例子 做了一个 流布局
#define WIDTH self.collectionView.frame.size.width
#import "JYLayout.h"
@interface JYLayout ()
//创建一个所有布局的数组
@property(nonatomic,strong)NSArray <UICollectionViewLayoutAttributes *>*attributeArr;
@end
@implementation JYLayout
//准备布局的时候调用
-(void)prepareLayout{
[superprepareLayout];
//最小列间距
CGFloat minW =self.minimumInteritemSpacing;
//最小行间距
CGFloat minH =self.minimumLineSpacing;
//看看一共有多少个
NSInteger count=[self.collectionViewnumberOfItemsInSection:0];
//大cell的宽高
CGFloat bigViewW = (WIDTH-minW)/2;
CGFloat bigViewH = bigViewW;
//中cell的宽高
CGFloat midViewW = (WIDTH-2*minW)/3;
CGFloat midViewH = midViewW;
//小cell的宽高
CGFloat smallViewW = (WIDTH -3*minW)/4;
CGFloat smallViewH = smallViewW;
//计算组高度
CGFloat groupH=3*minH+bigViewH+midViewH+smallViewW;
//创建一个临时可变数组暂时盛放布局
NSMutableArray *arr=[[NSMutableArrayalloc]init];
//循环创建布局
for (int i=0; i<count; i++) {
//看看是哪个组的 ps:一个组有2+3+4=9个
NSInteger group = i/9;
//看看是组里的第几个
NSInteger index=i%9;
CGFloat W;
CGFloat H;
CGFloat X;
CGFloat Y;
switch (index) {
case0:
X=0;
Y=minH+(groupH)*group;
W=bigViewH;
H=bigViewH;
break;
case1:
X=WIDTH-bigViewW;
Y=minH+(groupH)*group;
W=bigViewH;
H=bigViewH;
break;
case2:
X=0;
Y=minH+(groupH)*group+minH+bigViewH;
W=midViewW;
H=midViewH;
break;
case3:
X=midViewW+minW;
Y=minH+(groupH)*group+minH+bigViewH;
W=midViewW;
H=midViewH;
break;
case4:
X=WIDTH-midViewW;
Y=minH+(groupH)*group+minH+bigViewH;
W=midViewW;
H=midViewH;
break;
case5:
X=0;
Y=minH+(groupH)*group+minH+bigViewH+minH+midViewH;
W=smallViewW;
H=smallViewH;
break;
case6:
X=minW+smallViewW;
Y=minH+(groupH)*group+minH+bigViewH+minH+midViewH;
W=smallViewW;
H=smallViewH;
break;
case7:
X=minW+smallViewW+minW+smallViewW;
Y=minH+(groupH)*group+minH+bigViewH+minH+midViewH;
W=smallViewW;
H=smallViewH;
break;
case8:
X=minW+smallViewW+minW+smallViewW+minW+smallViewW;
Y=minH+(groupH)*group+minH+bigViewH+minH+midViewH;
W=smallViewW;
H=smallViewH;
break;
default:
break;
}
//创建布局属性
UICollectionViewLayoutAttributes *att = [UICollectionViewLayoutAttributeslayoutAttributesForCellWithIndexPath:[NSIndexPathindexPathForItem:iinSection:0]];
att.frame =CGRectMake(X , Y , W, H);
[arr addObject:att];
}
self.attributeArr = [arrcopy];
//计算itemsize
//如果不算高度的话 不能正好划到底部
//计算一共的组数
int totalGroupCount = (int)count /9;
int yushu = count %9;
CGFloat totalH;
if (yushu ==0||yushu==8||yushu==7||yushu==6) {
if (yushu==0) {
totalH = totalGroupCount*groupH;
}else{
totalH = totalGroupCount*groupH+groupH;
}
}elseif (yushu == 5||yushu==4||yushu==3){
totalH = totalGroupCount*groupH-minH-smallViewH+groupH;
}else {
totalH = totalGroupCount*groupH-minH-smallViewH-minH-midViewH+groupH;
}
self.itemSize =CGSizeMake(WIDTH, (totalH-count*minH)/(count-1));//这个高度很重要
}
- (nullableNSArray<__kindofUICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{
returnself.attributeArr;
}
@end
调用只需要一行代码就好了
self.collectionView=[[UICollectionViewalloc]initWithFrame:self.view.framecollectionViewLayout:[JYLayoutnew]];
//下面是结果展示
//如果有什么不到之处,欢迎多多与我交流