Swift-以编程方式添加/删除特定视图的约束

Swift-以编程方式添加/删除特定视图的约束,swift,autolayout,constraints,Swift,Autolayout,Constraints,我正在尝试使用一个信息视图,一旦点击信息按钮,它就会打开。见图: 我希望infoView与按下的按钮垂直对齐。 我收集了一个纽扣。 这是我的密码: @IBOutlet var infoButtons: [UIButton]! @IBAction func infoButtonPressed(_ sender: UIButton) { var alignYConstraint = NSLayoutConstraint() switch sender.tag { case

我正在尝试使用一个信息视图,一旦点击信息按钮,它就会打开。见图:

我希望infoView与按下的按钮垂直对齐。 我收集了一个纽扣。 这是我的密码:

@IBOutlet var infoButtons: [UIButton]!

@IBAction func infoButtonPressed(_ sender: UIButton) {
    var alignYConstraint = NSLayoutConstraint()
    switch sender.tag {
    case 1:
         alignYConstraint = NSLayoutConstraint(item: infoView, attribute: .centerY, relatedBy: .equal, toItem: infoButtons[0], attribute: .centerY, multiplier: 1.0, constant: 0)
        NSLayoutConstraint.activate([alignYConstraint])
        infoView.isHidden = false
        infoView.textView.text = "Text goes here"
        infoView.onClickCallback = {
            self.infoView.isHidden = true
            //                    self.infoView.removeFromSuperview()
            NSLayoutConstraint.deactivate([alignYConstraint])
        }
    case 2:
         alignYConstraint = NSLayoutConstraint(item: infoView, attribute: .centerY, relatedBy: .equal, toItem: infoButtons[1], attribute: .centerY, multiplier: 1.0, constant: 0)
        NSLayoutConstraint.activate([alignYConstraint])
        infoView.isHidden = false
        infoView.textView.text = "Different text"
        infoView.onClickCallback = {
            self.infoView.isHidden = true
            NSLayoutConstraint.deactivate([alignYConstraint])
        }
    ....................
    }
}
我有两个问题:

1) 如果单击“关闭”按钮,一切都会正常工作,但如果在关闭“信息视图”之前单击另一个“信息”按钮,则会出现冲突的约束,并且视图不会按要求对齐。我已尝试删除以前的约束。。。但显然我不能成功

2) 我试图关闭infoView,即使我点击infoView之外的任何地方,但这里也存在同样的问题:约束冲突,视图将无法与正确的按钮对齐


谢谢你的帮助。

我通过添加数组解决了这个问题

我在类的开头初始化了一个数组(var constraint=NSLayoutConstraint),然后每次单击该数组中的约束时都将其添加。 每次单击按钮时,我都会检查数组是否为空。如果不是,我移除约束。代码如下:

if sender.tag == 1{
        if constraint.count > 0 {
            NSLayoutConstraint.deactivate(constraint)
            constraint.removeAll()
        }
        let alignYConstraint = NSLayoutConstraint(item: infoView, attribute: .centerY, relatedBy: .equal, toItem: infoButtons[0], attribute: .centerY, multiplier: 1.0, constant: 0)
        NSLayoutConstraint.activate([alignYConstraint])
        constraint.append(alignYConstraint)
        infoView.isHidden = false
        infoView.textView.text = "Text goes here"
        infoView.onClickCallback = {
            self.infoView.isHidden = true
            //self.infoView.removeFromSuperview()
            NSLayoutConstraint.deactivate([alignYConstraint])
        }
    }else if sender.tag == 2 {
        if constraint.count > 0 {
            NSLayoutConstraint.deactivate(constraint)
            constraint.removeAll()
        }
.............