如何为自动布局锚点约束添加标识符?

时间:2017-02-28 16:09:43

标签: ios swift debugging autolayout nslayoutconstraint

我想为所有约束添加标识符,以便我可以调试问题。问题是如果我使用锚点,我不会直接创建所有约束。 我可以创建一个约束:

 let constraint = NSLayoutConstraint(item: view, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 60.0)

但是我必须将它添加到视图中,而不是heightAnchor(没有与UIStackViews相关联的.addConstraint()方法)

那么如何在这些代码行自动生成的约束中添加标识符:

    view.heightAnchor.constraint(equalToConstant: 60.0).isActive = true
    view.widthAnchor.constraint(equalToConstant: 60.0).isActive = true

锚点应该使编程自动布局更容易,但肯定不会以无法正确调试为代价? 如果我无法添加标识符,如何调试“不可满足”约束异常?

4 个答案:

答案 0 :(得分:3)

您的代码会返回约束,因此您可以像这样添加标识符

let myConstraint = view.heightAnchor.constraint(equalToConstant: 60.0)
myConstraint.identifier = "myIdentifier"
myConstraint.isActive = true

答案 1 :(得分:2)

看看我在question中给出的答案。它会给你一个问题的答案。

  

(没有.addConstraint()方法

是的,有:

NSLayoutConstraint.activate([constraintvariable])

修改

好的,如果我理解你的问题:

let vHeightConstraint = self.view.heightAnchor.constraint(equalToConstant: 60.0);
vHeightConstraint.isActive = true
vHeightConstraint.identifier = "Your identifier"

这样你就可以得到一个约束变量,并且可以在调试时看到它的值。

答案 2 :(得分:1)

我使用数组并激活/停用它们:

var p = [NSLayoutConstraint]() // portrait constraints
var l = [NSLayoutConstraint]() // landscape constraints

// (an example of this) pin segmentedView to top

p.append(segmentedControl.topAnchor.constraint(equalTo: imageLayout.topAnchor))
p.append(segmentedControl.widthAnchor.constraint(equalToConstant: 300))
p.append(segmentedControl.centerXAnchor.constraint(equalTo: imageLayout.centerXAnchor))
l.append(segmentedControl.topAnchor.constraint(equalTo: imageLayout.topAnchor))
l.append(segmentedControl.widthAnchor.constraint(equalToConstant: 300))
l.append(segmentedControl.centerXAnchor.constraint(equalTo: imageLayout.centerXAnchor))

public func setOrientation(_ p:[NSLayoutConstraint], _ l:[NSLayoutConstraint]) {
    NSLayoutConstraint.deactivate(l)
    NSLayoutConstraint.deactivate(p)
    if self.bounds.width > self.bounds.height {
        NSLayoutConstraint.activate(l)
    } else {
        NSLayoutConstraint.activate(p)
    }
}

您明白了......将约束移动到数组中并根据需要激活/停用。

答案 3 :(得分:1)

我使用Swift 4.2的方法有所不同。我希望这可能会有用。

extension UIView{

    func getConstraint(forAttribute attribute:NSLayoutConstraint.Attribute)->NSLayoutConstraint?{

        for aConstraint in constraints{

            if aConstraint.firstAttribute == attribute{

                return aConstraint

            }

        }

        return nil

    }

}

所以你可以做

@IBOutlet weak var confirmButton: MainButton!{
    didSet{
        confirmButton.getConstraint(forAttribute: .height)!.identifier = aID
        confirmButton.isEnabled = false
    }
}

myOtherButton.getConstraint(forAttribute: .height)?.identifier = "newIdentifier"