UICollectionView默认Cell两端对齐,如何让其居左对齐

1、先看图:

simulator-screen-shot-2016%e5%b9%b410%e6%9c%8813%e6%97%a5-%e4%b8%8a%e5%8d%8810-32-42

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

Leave a Reply