如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

Posted

技术标签:

【中文标题】如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]【英文标题】:How to use constraint Identifiers in autolayout and how to change constrain using identifiers? [Swift] 【发布时间】:2016-04-27 04:40:42 【问题描述】:

当我在 Xcode 7 中编辑我的约束时,我在 Interface Builder 中找到了 identifier 字段。什么是约束的标识符我如何使用它?使用标识符可以以编程方式访问约束并更改常量吗?我的问题是该标识符为什么以及如何有帮助?

有没有办法通过在子视图中循环并再次循环约束子视图的标识符来访问约束。我的意思是有什么方法可以直接访问约束而无需循环。

更新

我尝试了这段代码,但只访问了宽度和高度约束

    for subview in view.subviews 
        for constraint in subview.constraints() 
           if constraint.identifier == "identifier" 
                return constraint
           
        
    

【问题讨论】:

在这里回答:***.com/questions/27791597/… ***.com/questions/33038451/… @oyalhi 我更新了问题.. @EICaptain 我更新了我的问题 如果你有约束错误,你可以使用标识符来调试你的约束 【参考方案1】:

如何:标识符在调试时很有用(例如,约束不匹配,其中一个在运行时被破坏;约束标识符显示在日志中,因此您可以看看哪一个可能会导致问题)

为什么:约束标识符使日志更易于阅读、更准确,并且可以为您节省大量时间。

约束编辑:如果您想以编程方式更改约束,您必须将它们声明为 outlets(如标签或按钮),然后将它们从视图中移除(不是对象本身),然后将它们再次设置到视图中。据我所知,您不能仅以编程方式“编辑”约束。

您的代码只为您提供宽度和高度,因为您访问的视图约束只包含对象的宽度和高度。

【讨论】:

实际上可以在将约束声明为插座后对其进行修改,如下所示:self.myConstraint.constant = 50.0【参考方案2】:

在 Swift 4 中是可能的:

有了这个扩展:

extension UIView
    func constraintWith(identifier: String) -> NSLayoutConstraint?
        return self.constraints.first(where: $0.identifier == identifier)
    

你不能这样使用:

 if let myConstraint = myView.constraintWith(identifier: "myConstraintID")
     myConstraint.constant = 8
 

Ps:请务必在添加了约束的视图上调用constraintWith(identifier: String),通常在您正在更改的相关视图的超级视图上,或者如果约束是针对大小(宽度/高度),则在其自身上调用

【讨论】:

更准确地说,如果您想访问视图的高度、宽度或纵横比,请在 view 本身上调用此方法。另一方面,要访问其他约束,例如前导或尾随,请在包含视图的SuperView 上调用此方法。 @rule_it_subir 这一切都取决于您设置约束的方式【参考方案3】:

为了补充答案,我们还可以通过编程设置约束,这比我想象的要容易:

        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)>

【讨论】:

以上是关于如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]的主要内容,如果未能解决你的问题,请参考以下文章

如何在情节提要中使用自动布局在不同设备尺寸上设置动态位置的约束

如何在没有 IBOutlet 或标识符的情况下从 Storyboard 更新约束?

如何自动设置小写包标识符

如何使用自动布局为纵向和横向方向配置不同的布局?

如何在我的表视图中反映 xib 文件的约束?

如何正确设置水平图像视图的自动布局约束?