【问题标题】:Swift - Programatically add/remove Constraint for specific viewSwift - 以编程方式添加/删除特定视图的约束
【发布时间】:2017-07-23 00:21:56
【问题描述】:

我正在尝试使用点击信息按钮后打开的 infoView。见图片:

我希望 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 之外的任何位置,但这里也存在同样的问题:约束冲突并且视图不会与正确的按钮对齐

感谢您的帮助。

【问题讨论】:

    标签: swift autolayout constraints


    【解决方案1】:

    我通过添加数组解决了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-18
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多