1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//
// UIView+TileSubviews.m
// Gengmei
//
// Created by wangyang on 2016/10/26.
// Copyright © 2016年 更美互动信息科技有限公司. All rights reserved.
//
#import "UIView+TileSubviews.h"
#import "UIView+Layout.h"
@implementation UIView (TileSubviews)
- (CGFloat)layoutSubviews:(NSArray<UIView *> *)views
padding:(UIEdgeInsets)padding
spacing:(CGPoint)spacing
maxWidth:(CGFloat)maxWidth
subviewSize:(CGSize (^)(NSUInteger idx))caculater {
__block CGFloat allHeight = 0;
__block UIView *preView;
[views enumerateObjectsUsingBlock:^(UIView * obj, NSUInteger idx, BOOL *stop) {
UIView *item = views[idx];
CGSize size = item.intrinsicContentSize;
if (caculater) {
size = caculater(idx);
}
views[idx].size = size;
if (idx == 0) {
item.left = padding.left;
item.top = padding.top;
preView = item;
} else {
//如果当前button超出了屏幕,则换行
NSInteger totleW = preView.right + spacing.x + size.width + padding.right;
if (totleW > maxWidth) {
item.left = padding.left;
item.top = preView.bottom + spacing.y;
}else{
item.left = preView.right + spacing.x;
item.top = preView.top;
}
}
preView = item;
}];
allHeight = preView.bottom + padding.bottom;
return allHeight;
}
- (CGFloat)layoutSubviews:(NSArray<UIView *> *)views
padding:(UIEdgeInsets)padding
spacing:(CGPoint)spacing
maxWidth:(CGFloat)maxWidth
singleLine:(BOOL)singleLine
subviewSize:(CGSize (^)(NSUInteger idx))caculater {
__block CGFloat allHeight = 0;
__block UIView *preView;
[views enumerateObjectsUsingBlock:^(UIView * obj, NSUInteger idx, BOOL *stop) {
UIView *item = views[idx];
CGSize size = item.intrinsicContentSize;
if (caculater) {
size = caculater(idx);
}
views[idx].size = size;
if (idx == 0) {
item.left = padding.left;
item.top = padding.top;
preView = item;
} else {
//如果当前button超出了屏幕,则换行
NSInteger totleW = preView.right + spacing.x + size.width + padding.right;
if (totleW > maxWidth) {
if (singleLine) {
[item removeFromSuperview];
} else {
item.left = padding.left;
item.top = preView.bottom + spacing.y;
preView = item;
}
}else{
item.left = preView.right + spacing.x;
item.top = preView.top;
preView = item;
}
}
}];
allHeight = preView.bottom + padding.bottom;
return allHeight;
}
@end