COSLayout 2.0.0

COSLayout 2.0.0

测试已测试
语言语言 CC
许可 MIT
发布最后发布2017年8月

Tianyong Tang 维护。



COSLayout 2.0.0

  • 作者:
  • Tianyong Tang

使布局变得简单。

介绍

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:%pH:%^pH:%@p表示百分比是水平的,V:%pV:%^pV:%@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%"];