iOS 自定义流布局 进阶篇
来源:互联网 发布:redis 数据库数量 编辑:程序博客网 时间:2024/04/30 06:43
在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]];
//下面是结果展示
//如果有什么不到之处,欢迎多多与我交流
- iOS 自定义流布局 进阶篇
- iOS开发进阶 - 自定义UICollectionViewLayout实现瀑布流布局
- 自定义流布局FlowLayout
- Android 自定义流布局
- 自定义流布局FlowGroup
- iOS流布局UICollectionView系列四——自定义FlowLayout进行瀑布流布局
- iOS流布局UICollectionView系列四——自定义FlowLayout进行瀑布流布局
- IOS 流布局
- iOS瀑布流布局
- 自定义流布局FloatLayout(一)
- 自定义标签布局(流布局)
- 自定义组件---瀑布流布局
- 自定义实现瀑布流布局
- iOS瀑布流布局实现
- 瀑布流布局与自定义瀑布流布局插件
- 自定义view/viewgroup/流布局(极简版)
- 自定义UICollectionViewFlowLayout进行瀑布流布局
- Android 自定义View实现文本流布局
- 最全经典总结: ios跳转到第三方应用,APP互相跳转传值
- Android View 事件分发机制 源码解析
- BZOJ 4195 [Noi2015] 程序自动分析
- Android开发笔记之自定义View
- 学习笔记-Java中的xml文件读取之DOM解析
- iOS 自定义流布局 进阶篇
- 每日一练——House Robber
- (转)linux信号列表详解
- nginx 脚本启动检查
- Windows驱动开发之注册表操作
- CodeForces 518B Tanya and Postcard
- 插入排序,希尔排序
- Android ViewGroup事件分发机制
- 4并查集的合并与删除