1

这是 github set view 中的一个示例,位于 superview 的中心。

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

我的问题是,当我用“|”替换“[superview]”时,就像苹果文档解释一样,我猜它们是平等的。实际上它们不是,它不会起作用。

我的代码。

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

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

4

2 回答 2

5

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

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);
于 2015-04-21T07:49:02.063 回答
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))
于 2020-04-13T22:13:03.017 回答