“|”之间的区别和 [superview] 在视觉格式语言中?
Different between "|" and [superview] in Visual Format Language?
这里是 example in github set view programming in the center of 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 有什么问题或错误吗?
苹果文档 here
原始代码使用了一个技巧(或 hack)。
AlignAllCenterY
并不是要在容器中居中视图。这些选项用于指定子视图的相对位置 - 例如,如果您在同一个容器中有 3 个标签,您可以使它们全部顶部对齐或居中对齐 - 而不是容器(由 [=12 隐式指定) =]).
诀窍在于,当您明确指定超级视图时,框架不会意识到它会添加约束。
使视图在其容器中居中的正确方法如下:
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);
constrains.append(contentsOf: NSLayoutConstraint.constraints(withVisualFormat: "H:|-[personImage(==50)]", options: [.alignAllCenterY], metrics: nil, views: views))
如果 personImage 是他自己,则不会发生任何事情。
如果您在 H:| 中有多个视图|那么你可以使用 .alignAllCenterY
如果您需要将一个视图与他的父视图对齐,请使用 Sulthan answer。谢谢
据我所知,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 的前导填充添加到 superview 设置宽度 50
constrains.append(contentsOf: NSLayoutConstraint.constraints(withVisualFormat: "H:|-[personImage(==50)]", options: [.alignAllCenterY], metrics: nil, views: views))
这里是 example in github set view programming in the center of 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 有什么问题或错误吗? 苹果文档 here
原始代码使用了一个技巧(或 hack)。
AlignAllCenterY
并不是要在容器中居中视图。这些选项用于指定子视图的相对位置 - 例如,如果您在同一个容器中有 3 个标签,您可以使它们全部顶部对齐或居中对齐 - 而不是容器(由 [=12 隐式指定) =]).
诀窍在于,当您明确指定超级视图时,框架不会意识到它会添加约束。
使视图在其容器中居中的正确方法如下:
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);
constrains.append(contentsOf: NSLayoutConstraint.constraints(withVisualFormat: "H:|-[personImage(==50)]", options: [.alignAllCenterY], metrics: nil, views: views))
如果 personImage 是他自己,则不会发生任何事情。
如果您在 H:| 中有多个视图|那么你可以使用 .alignAllCenterY
如果您需要将一个视图与他的父视图对齐,请使用 Sulthan answer。谢谢 据我所知,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 的前导填充添加到 superview 设置宽度 50
constrains.append(contentsOf: NSLayoutConstraint.constraints(withVisualFormat: "H:|-[personImage(==50)]", options: [.alignAllCenterY], metrics: nil, views: views))