“|”的区别 和 [superview] 在视觉格式语言?

Alb*_*ing 1 constraints ios visual-format-language swift

这是在超级视图的中心以编程方式在 github set view 中的一个示例

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

我的问题是,虽然我用“|”替换了“[superview]”,就像苹果文档解释一样,我猜它们是相等的。实际上他们不是,而且它不会工作。

我的代码。

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

有什么问题吗,或者 VFL 有错误?苹果文档在这里

Sul*_*han 5

原始代码使用了技巧(或 hack)。

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

诀窍是,当您明确指定超级视图时,框架不会意识到它添加了约束。

将视图在其容器中居中的正确方法如下:

let centerX = NSLayoutConstraint(item: label, 
                            attribute: .CenterX, 
                            relatedBy: .Equal,
                               toItem: view,
                            attribute: .CenterX, 
                           multiplier: 1.0,        
                             constant: 0.0);
view.addConstraint(centerX);

let centerY = NSLayoutConstraint(item: label, 
                            attribute: .centerY, 
                            relatedBy: .Equal,
                               toItem: view,
                            attribute: .centerY, 
                           multiplier: 1.0,        
                             constant: 0.0);
view.addConstraint(centerY);
Run Code Online (Sandbox Code Playgroud)