如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [Swift]
How to use constraint Identifiers in autolayout and how to change constrain using identifiers? [Swift]
当我在 Xcode 7 中编辑约束时,我在 Interface Builder 中找到了 identifier 字段。约束的标识符是什么?如何使用它?使用标识符可以以编程方式访问约束并更改常量吗?我的问题是该标识符为何以及如何提供帮助?
有没有办法通过在子视图中循环并再次循环约束子视图来访问带有标识符的约束。我的意思是有什么方法可以直接访问约束而无需循环。
UPDATE
我试过这段代码,但只能访问宽度和高度约束
for subview in view.subviews {
for constraint in subview.constraints() {
if constraint.identifier == "identifier" {
return constraint
}
}
}
HOW: 标识符在 调试 时很有用(例如约束不匹配,其中一个在 运行 处被破坏时间;约束标识符显示在日志中,因此您可以看到哪个可能导致问题)
原因:约束标识符使日志更易于阅读、更准确,并且可以节省大量时间。
约束编辑:如果您想以编程方式更改约束,您必须将它们声明为 outlets(如标签或按钮) ,然后将它们从视图中移除(不是对象本身),然后再次将它们设置到视图中。据我所知,您不能仅以编程方式 "edit" 约束。
您的代码仅提供宽度和高度,因为您访问的视图约束仅包含对象的宽度和高度。
在 Swift 4 中是可能的:
有了这个扩展:
extension UIView{
func constraintWith(identifier: String) -> NSLayoutConstraint?{
return self.constraints.first(where: {[=10=].identifier == identifier})
}
}
你可以这样使用:
if let myConstraint = myView.constraintWith(identifier: "myConstraintID"){
myConstraint.constant = 8
}
Ps:一定要在添加约束的视图上调用 constraintWith(identifier: String)
,通常是在您正在更改的相关视图的 superView 上,或者如果约束是针对大小的,则在自身上调用(width/height)
为了补充答案,我们还可以通过编程方式设置约束,这比我想象的要容易:
let yConstraint = imageView.centerYAnchor.constraint(equalTo: layout.centerYAnchor)
yConstraint.identifier = "yConstraint"
let xConstraint = imageView.centerXAnchor.constraint(equalTo: layout.centerXAnchor)
xConstraint.identifier = "xConstraint"
NSLayoutConstraint.activate([
yConstraint,
xConstraint
])
然后,它出现在控制台中,尽管仍然难以阅读...
<NSLayoutConstraint:0x6000025fe490 'xConstraint' UIImageView:0x7f8f41107fa0.centerX == UILayoutGuide:0x600003fcc1c0'UIViewLayoutMarginsGuide'.centerX (active)>
当我在 Xcode 7 中编辑约束时,我在 Interface Builder 中找到了 identifier 字段。约束的标识符是什么?如何使用它?使用标识符可以以编程方式访问约束并更改常量吗?我的问题是该标识符为何以及如何提供帮助?
有没有办法通过在子视图中循环并再次循环约束子视图来访问带有标识符的约束。我的意思是有什么方法可以直接访问约束而无需循环。
UPDATE
我试过这段代码,但只能访问宽度和高度约束
for subview in view.subviews {
for constraint in subview.constraints() {
if constraint.identifier == "identifier" {
return constraint
}
}
}
HOW: 标识符在 调试 时很有用(例如约束不匹配,其中一个在 运行 处被破坏时间;约束标识符显示在日志中,因此您可以看到哪个可能导致问题)
原因:约束标识符使日志更易于阅读、更准确,并且可以节省大量时间。
约束编辑:如果您想以编程方式更改约束,您必须将它们声明为 outlets(如标签或按钮) ,然后将它们从视图中移除(不是对象本身),然后再次将它们设置到视图中。据我所知,您不能仅以编程方式 "edit" 约束。
您的代码仅提供宽度和高度,因为您访问的视图约束仅包含对象的宽度和高度。
在 Swift 4 中是可能的:
有了这个扩展:
extension UIView{
func constraintWith(identifier: String) -> NSLayoutConstraint?{
return self.constraints.first(where: {[=10=].identifier == identifier})
}
}
你可以这样使用:
if let myConstraint = myView.constraintWith(identifier: "myConstraintID"){
myConstraint.constant = 8
}
Ps:一定要在添加约束的视图上调用 constraintWith(identifier: String)
,通常是在您正在更改的相关视图的 superView 上,或者如果约束是针对大小的,则在自身上调用(width/height)
为了补充答案,我们还可以通过编程方式设置约束,这比我想象的要容易:
let yConstraint = imageView.centerYAnchor.constraint(equalTo: layout.centerYAnchor)
yConstraint.identifier = "yConstraint"
let xConstraint = imageView.centerXAnchor.constraint(equalTo: layout.centerXAnchor)
xConstraint.identifier = "xConstraint"
NSLayoutConstraint.activate([
yConstraint,
xConstraint
])
然后,它出现在控制台中,尽管仍然难以阅读...
<NSLayoutConstraint:0x6000025fe490 'xConstraint' UIImageView:0x7f8f41107fa0.centerX == UILayoutGuide:0x600003fcc1c0'UIViewLayoutMarginsGuide'.centerX (active)>