Anchor notation(瞄点符号)
继上篇《在代码中使用Autolayout》 <br >
这篇主要讲“Anchor notation”和“Visual Format Syntax”
所有代码均在github上
在iOS9中,用Anchor nonation
做我之前做过的任何事情都是有可能的,创建同样的八个约束,然后把它们添加到同样的view上,使用一种更加紧凑的标记。之前的nonation有一些奇特的特点,那就是一个NSLayoutConstraint
初始化方法可以创建任何约束。新的Anchor notation
采用了一种相反的方式,它聚焦在简洁上,但是却牺牲了突出点。为了做到这一点,除了聚焦于约束上,它也聚焦在约束关联的属性上。这些属性被描述为UIView
的anchor
属性。
-
topAnchor
,bottomAnchor
-
leftAnchor
,rightAnchor
,leadingAnchor
,trailingAnchor
-
centerXAnchor
,centerYAnchor
-
firstBaselineAnchor
,lastBaselineAnchor
<br >
所有的瞄点值都是NSLayoutAnchor的实例(其中一些也是NSLayoutAnchor子类的实例)。建立约束的方法都是NSLayoutAnchor的实例化方法,而且有很多这样的方法,选择哪一个取决于你的约束需要具体描述的另一个anchor(当然constant保持默认0,multiplier默认保持1),constant或者multiplier或者他们两个,都取决于你对以下关系的选择:
constraintEqualToConstant:
constraintGreaterThanOrEqualToConstraint:
constraintLessThanOrEqualConstant:
constraintEqualToAnchor:
constraintGreaterThanOrEqualToAnchor:
constraintLessThanOrEqualToAnchor:
constraintEqualToAnchor:constant:
constraintGreaterThanOrEqualToAnchor:constant:
constraintLessThanOrEqualToAnchor:constant:
constraintEqualToAnchor:multiplier:
constraintGreaterThanOrEqualToAnchor:multiplier:
constraintLessThanOrEqualToAnchor:multiplier:
constraintEqualToAnchor:multiplier:constant:
constraintGreaterThanOrEqualToAnchor: multiplier: constant:
constraintLessThanOrEqualToAnchor: multiplier: constant:
所有的这些当我描述的时候你可能挺起来非常细心,但是当你在实例中看他们的时候,你会很欣赏这些紧凑的注解所带来的好处。他们是如此地好写,(尤其多亏了Xcode的代码自动补全)如此地好读,如此地好维护。这些新的notation在和activateContraints:
方法相连接的时候是非常方便的,因为我们不用去关心每一条约束被明确地添加到那个view上:(就像下面那样:)
NSLayoutAnchor.activateContraints([
v2.leadingAnchor.constraintEqualToAnchor(v1.leadingAnchor),
v2.trailingAnchor.constraintEqualToAnchor(v1.trailingAnchor),
v2.topAnchor.constraintEqualToAnchor(v1.topAnchor),
v2.heightAnchor.constraintEqualToConstant(10),
v3.widthAnchor.constraintEqualToConstant(20),
v3.heightAnchor.constraintEqualToConstant(20),
v3.trailingAnchor.constraintLessThanOrEqualToAnchor(v1.trailingAnchor),
v3.bottomAnchor.constraintEqualToAnchor(v1.bottomAnchor)
])
这八行代码中的八个约束,加上包围的acitvateConstraints
方法调用来把这些约束落实到我们的interface上。这儿并没有严格需要将所有的约束一下子activate,但是最好这样做。
Visual format notation(视觉符号格式)
另一种来缩写创建约束的方式是使用某种基于文本的速记,叫做视觉符号格式。这个可以让你同步的描述多种约束。它也是特别具体的当你安排一系列竖直方向或者水平方向的view的时候。我会以一个很简单的例子开头:
V:|[v2(10)]
在上述表达中,V:
代表论述下的vertical deimension
,另一半选择是H:
,它也是默认的(因此准许不指明尺寸)。一个view的名字出现在括号里,同时一个竖直符号表示superview
,所以这里我们正在描绘v2的top edge顶住它superview的top edge。数字的符号表示参数,同时数字符号伴同view的名字设置view的尺寸,所以在这里我们设置v2的height为10。
使用visual format,你不得不提供一个字典来装上面提到的view的名字字符。例如:使用之前表达的字典可以为["v2":v2]。所以这里还有之前表达的另一种方式,使用visual format的简称。
let d = ["v2":v2, "v3":v3]
NSLayoutConstraint.activateContraints([
NSLayoutConstraint.constraintWithVisualFormat("H:|[v2]|", options: [], merics: nil, views: d),
NSLayoutConstraint.constraintWithVisualFormat("V:|[v2(10)]", options: [], merics: nil, views: d),
NSLayoutConstraint.constraintWithVisualFormat("H:[v3(20)]|", options: [], merics: nil, views: d),
NSLayoutConstraint.constraintWithVisualFormat("V:[v3(20)]|", options: [], merics: nil, views: d)
].flatten().map{$0})
这个例子创建了和之前例子相同的约束,但是却使用了五行命令却不是八行。(constraintWithVisualFormat: 方法产生了一个constraints的数组,所以字面上的数组是一个装着约束数组的数组,但是activateContraintsiule 期望只有一个数组约束,所以我筛选出我想要的数组)
visual format语法将其自身展示到极致当多种的view沿着同一纬度布置彼此。在那种情况下,你可以减小很多压力。(一些约束由同一个visual format生成)这种语法,在一中程度上也被限制在乐意表达的语法中。同时他也隐藏了约束的数量和产生的约束的特征。同时就我而言,我发现当使用visual format语法的时候比完整地表达出每一个约束更容易犯错。但是,你还是希望能够熟悉visual format,不仅仅是为了隐藏具体描述某个约束的细节。
当你使用visual format语法的时候这里有一些需要深入的事情:
-
metrics
: 参数是一个有用数字的字典。这可以让你使用一个visual format string的名字。 -
options
: 参数是一个bitmask(NSLayoutFormatOptions), 主要让你做一些事情,例如添加alignments。alignments被应用在所有在visual format中提到的views。 - 为了具体地别是两个连续的view之间的距离,使用连字符
-
环绕在数字符号周围,像:“[v1]-[20]-[v2]”。数字可以选择性的使用括号[]
包围。 - 一个在括号中的数字可能会地位高于一个同等的或者不同等的操作符。同时也可以跟随一个
@
符号表示priority。被逗号,
分割的多种数字,也可以出现在参数中。例如[v1(>=20@400, <=30)]
<br >
想要了解更多关于visual format语法,请查看"Apple's Auto Layout Guide"一章中的"Visual Format Syntax"