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

时间:2017-07-22 12:24:42

标签: swift autolayout constraints

我正在尝试使用一个轻触信息按钮打开的infoView。见图:

enter image description here

我希望infoView与按下的按钮垂直对齐。 我有一个UIbutton集合。 这是我的代码:

@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)如果我点击关闭按钮一切都很完美,但是如果我在关闭infoView之前点击另一个信息按钮,那么我会有相互冲突的约束,视图将不会按要求对齐。我试图删除以前的约束......但显然我无法取得成功。

2)我试图关闭infoView,即使我点击infoView之外的任何地方,但同样的问题:冲突的约束和视图将不会与正确的按钮对齐

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我通过添加数组来解决。

我在类的开头初始化了一个数组(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()
        }
.............