1、先看图:
2、基本设计思路
2.1、UICollectionView的布局通过UICollectionViewFlowLayout实现;
2.2、UICollectionViewFlowLayout有个方法
1 | - (nullable NSArray<__kindof UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect</__kindof> |
2.3、这个方法是返回UICollectionViewLayoutAttributes对象数组,每一个UICollectionViewLayoutAttributes对象决定了一个cell的大小位置及各种布局属性;
2.4、在这个方法上下手,实现左对齐应该不是什么问题;问题是全部自定义每一个cell的布局吗?
2.5、其实我们只需要将原有的两端对齐改成左对齐就可以了,其他并不需要变动;
2.6、这也就意味着只需要修改frame的x值即可,其他都原封不动;
3、关键算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | - (nullable NSArray<__kindof UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect { NSArray *array = [super layoutAttributesForElementsInRect:rect]; if (array.count == 0) return array; NSInteger count = array.count; NSMutableArray *attributes = [NSMutableArray array]; [attributes addObject:[array firstObject]]; for (int i = 0; i < count; i++) { if (i == 0) continue; UICollectionViewLayoutAttributes *a0 = [array objectAtIndex:i - 1]; UICollectionViewLayoutAttributes *a1 = [array objectAtIndex:i]; CGRect frame0 = a0.frame; CGRect frame1 = a1.frame; // 当前这个不为行内首个时才需要修改frame if (frame0.origin.y == frame1.origin.y) { frame1.origin.x = CGRectGetMaxX(frame0) + 10; a1.frame = frame1; } [attributes addObject:a1]; } return attributes; } |
4、Demo下载:SACollectionView