使布局变得简单。
COSLayout
是另一个布局库。它既不是 Auto Layout 的包装程序,也不是替代品。它不处理约束和约束优先级的循环引用。除此之外,COSLayout
还能解决所有布局场景。更重要的是,COSLayout
提供了一些额外的优点:更小的内存占用,更好的性能,以及更直观的表达。
COSLayout
是视图布局的抽象。通过 COSLayout
,您可以指定视图相对于其父视图、兄弟视图和非兄弟视图的布局。以下示例指定了一个从视图底部到父视图底部的 10 点约束
UIView *view = [[UIView alloc] init];
COSLayout *layout = [COSLayout layoutOfView:view];
[layout addRule:@"bb = 10"];
在上述示例中,通过 addRule:
方法向布局中添加了一个规则。规则用样例布局语言("SLL")表达,可以直观地指定约束。SLL 的语法很简单,仅是逗号分隔的赋值表达式。每个赋值表达式指定一个约束,左值是约束名称,右值是约束值。
COSLayout
支持 18 个约束
约束 | 方向 | 描述 |
---|---|---|
w |
水平 | 视图的宽度 |
h |
垂直 | 视图的高度 |
tt |
垂直 | 视图顶部到父视图顶部的空间 |
tb |
垂直 | 视图顶部到父视图底部的空间 |
ll |
水平 | 视图左侧到父视图左侧的空间 |
lr |
水平 | 视图左侧到父视图右侧的空间 |
bb |
垂直 | 视图底部到父视图底部的空间 |
bt |
垂直 | 视图底部到父视图顶部的空间 |
rr |
水平 | 视图右侧到父视图右侧的空间 |
rl |
水平 | 视图右侧到父视图左侧的空间 |
ct |
垂直 | 视图中心到父视图顶部的空间 |
cl |
水平 | 视图中心到父视图左侧的空间 |
cb |
垂直 | 视图中心到父视图底部的空间 |
cr |
水平 | 视图中心到父视图右侧的空间 |
minw |
水平 | 视图的最小宽度 |
maxw |
水平 | 视图的最大宽度 |
minh |
垂直 | 视图的最小高度 |
maxh |
垂直 | 视图的最大高度 |
COSLayout
支持五种约束值类型
约束值类型 | 示例 | 描述 |
---|---|---|
CGFloat |
5 -10 20.0
|
屏幕上的固定长度 |
百分比 |
5% -10% 20.0%
|
父视图宽度和高度的百分比 |
格式说明符 |
%tt %w %f |
通过附加参数给出的约束值 |
约束 |
tt maxw |
当前布局的唯一约束值 |
None | nil |
用于重置一个约束 |
请注意,百分比在不同约束方向上有不同的含义。如果当前约束方向是水平方向,百分比表示superview的宽度百分比,否则表示superview的高度百分比。您也可以通过H:
(水平)或V:
(垂直)前缀指定百分比的方向。例如,H:50%
表示superview宽度的50%,V:30%
表示superview宽度的30%。
格式指定符表示由额外参数提供的约束值。例如,%tt
表示其他视图的顶部与superview顶部之间的距离。在这里,其他视图由额外参数提供,superview是布局视图的superview。这意味着COSLayout
可以指定非同级视图之间的约束。
COSLayout
支持20种格式指定符
格式 | 类型 | 描述 |
---|---|---|
%tt |
UIView * |
视图顶部到父视图顶部的空间 |
%tb |
UIView * |
视图顶部到父视图底部的空间 |
%ll |
UIView * |
视图左侧到父视图左侧的空间 |
%lr |
UIView * |
视图左侧到父视图右侧的空间 |
%bb |
UIView * |
视图底部到父视图底部的空间 |
%bt |
UIView * |
视图底部到父视图顶部的空间 |
%rr |
UIView * |
视图右侧到父视图右侧的空间 |
%rl |
UIView * |
视图右侧到父视图左侧的空间 |
%ct |
UIView * |
视图中心到父视图顶部的空间 |
%cl |
UIView * |
视图中心到父视图左侧的空间 |
%cb |
UIView * |
视图中心到父视图底部的空间 |
%cr |
UIView * |
视图中心到父视图右侧的空间 |
%w |
UIView * |
视图的宽度 |
%h |
UIView * |
视图的高度 |
%f |
CGFloat |
屏幕上的固定长度 |
%p |
CGFloat |
superview宽度的百分比或superview高度的百分比 |
%^f |
CGFloat(^)(UIView *) |
由块提供的空间 |
%^p |
CGFloat(^)(UIView *) |
由块提供的百分比 |
%@f |
id&COSCGFloatProtocol |
由对象提供的空间 |
%@p |
id&COSCGFloatProtocol |
由对象提供的百分比 |
类似于百分比约束值,您也可以使用H:
和V:
前缀来指定百分比的方向。例如,H:%p
,H:%^p
,H:%@p
表示百分比是水平的,V:%p
,V:%^p
,V:%@p
表示百分比是垂直的。
值得一提的是,格式指定符还在两个视图之间创建了一种依赖关系:布局视图和额外参数提供的其他视图。在COSLayout
中,依赖关系通过DAG表示。因此,COSLayout
不支持循环依赖。当superview需要布局时,所有子视图的布局会根据依赖关系解决其约束。
您可以在约束值之间应用算术运算符。与其他语言一样,SLL支持5种基本算术运算符
运算符名称 | 优先级 | 结合性 | 代码示例 |
---|---|---|---|
= |
1 | right |
tt = 20 ct = 50% |
+= |
1 | right |
tt += 20 ct += 50% |
-= |
1 | right |
tt -= 20 ct -= 50% |
*= |
1 | right |
tt *= 20 ct *= 50% |
/= |
1 | right |
tt /= 20 ct /= 50% |
+ |
2 | left |
10 + 20 50% + 10 %w + 5 |
- |
2 | left |
20 - 10 50% - 10 %h - 5 |
* |
3 | left |
50 * 2 80% * 0.5 %h * 2 |
/ |
3 | left |
100 / 2 100% / 2 %h / 2 |
您还可以使用括号()分组子表达式,以改变表达式求值的顺序。
在以下示例中,COSLayout
将视图的右上角与superview的右上角对齐,并添加5个点的空隙。
UIView *view = [[UIView alloc] init];
COSLayout *layout = [COSLayout layoutOfView:view];
[layout addRule:@"tt = rr = 5"];
在以下示例中,COSLayout
将视图的左/下/右对齐到superview的左/下/右,并添加10个点的空隙,并将视图的顶部对齐到superview的中心。
UIView *view = [[UIView alloc] init];
COSLayout *layout = [COSLayout layoutOfView:view];
[layout addRule:@"ll = bb = rr = 10, tt = 50%"];