“|”之间有所不同和[superview]的视觉格式语言?

时间:2015-04-21 07:30:49

标签: ios swift constraints visual-format-language

这是github集视图中的example程序化地位于超视图的中心。

constraints = NSLayoutConstraint.constraintsWithVisualFormat(
      "H:[superview]-(<=1)-[label]",
      options: NSLayoutFormatOptions.AlignAllCenterY,
      metrics: nil,
      views: ["superview":view, "label":label])

我的问题是,当我更换了&#34; [superview]&#34;与&#34; |&#34;,就像苹果文档解释一样,我猜他们是平等的。实际上他们不是, 它不起作用。

我的代码。

   constraints = NSLayoutConstraint.constraintsWithVisualFormat(
                    "H:|-(<=1)-[imageview]",
                    options: NSLayoutFormatOptions.AlignAllCenterY,
                    metrics: nil,
                    views: ["imageview":imageview])

有任何错误,或VFL的错误? 苹果文件here

2 个答案:

答案 0 :(得分:4)

原始代码使用技巧(或黑客)。

AlignAllCenterY并不是要在容器中居中视图。选项用于指定子视图的相对位置 - 例如,如果在同一容器中有3个标签,则可以使它们在它们之间全部顶部对齐或居中对齐 - 而不是与容器(由{{1隐式指定) }})。

诀窍在于,当您明确指定超级视图时,框架并没有意识到它会添加约束。

将视图置于其容器中心的正确方法如下:

|

答案 1 :(得分:0)

constrains.append(contentsOf: NSLayoutConstraint.constraints(withVisualFormat: "H:|-[personImage(==50)]", options: [.alignAllCenterY], metrics: nil, views: views))

如果personImage本身没有任何作用。

如果H内有多个视图:| |那么您可以使用.alignAllCenterY

如果您需要将一个视图与其超级视图对齐,请使用Sulthan答案。谢谢 VFL不能选择将一个视图与超级视图对齐,这并不是我所知道的。

以下代码将创建宽50高50的图像, 以Y为中心

let centerY = NSLayoutConstraint(item: personImage,
                                    attribute: .centerY,
                                    relatedBy: .equal,
                                       toItem: self,
                                    attribute: .centerY,
                                   multiplier: 1.0,
                                     constant: 0.0);
        self.addConstraint(centerY);

也将高度设置为50

 constrains.append(contentsOf: NSLayoutConstraint.constraints(withVisualFormat: "V:[personImage(==50)]", options: [], metrics: nil, views: views))

也将10的前导填充添加到超级视图设置的宽度50中

constrains.append(contentsOf: NSLayoutConstraint.constraints(withVisualFormat: "H:|-[personImage(==50)]", options: [.alignAllCenterY], metrics: nil, views: views))