NSLayoutConstraint不会每次都更新

时间:2018-04-03 07:44:49

标签: ios swift nslayoutconstraint

我正在使用NSLayoutConstraint进行测试,发现每次都不会更新布局 这是我ViewController的IB。 Took constraints in IB 在这里,我IBAction取得valueChange Stepper

@IBAction func handleStepperValueChanged(_ sender: UIStepper) {
    progressBar.progress = Float(sender.value / sender.maximumValue)
    lblProgress.text = String(format: "%.2f %", progressBar.progress)

    updateMyConstraint()
}
func updateMyConstraint() {
    for constraints in lblProgress.constraints {
        if constraints.firstAttribute == .width {
            lblProgress.removeConstraint(constraints)
        }
    }
    let multiplier = CGFloat(progressBar.progress)
    let constLblWidth = NSLayoutConstraint(item: lblProgress, attribute: .width, relatedBy: .equal, toItem: progressBar, attribute: .width, multiplier: multiplier, constant: 0.0)
    constLblWidth.priority = .defaultHigh
    lblProgress.translatesAutoresizingMaskIntoConstraints = false
    constLblWidth.isActive = true
    lblProgress.updateConstraints()
}

这是我的输出。 (每次更新Stepper的值时都不会更新) 0.40 0.50 0.60

我有什么东西可以让我更新布局吗? 请帮我解决这个问题 每次更新ProgressBar标签也应该增加其宽度。

我还尝试通过以下声明更新布局。

self.view.layoutIfNeeded()
self.view.layoutSubviews()

1 个答案:

答案 0 :(得分:1)

问题出在这里

lblProgress.removeConstraint(constraints)

应该从lblProgressprogressBar的父级删除约束  因为约束在他们之间

  func updateMyConstraint() {
    for constraints in self.view.constraints {

        if constraints.identifier == "someIdentifier"  && constraints.firstAttribute == .width {
              print(constraints)
              self.view.removeConstraint(constraints)
        }
    }
    let multiplier = CGFloat(progressBar.progress)
    let constLblWidth = NSLayoutConstraint(item: lbl, attribute: .width, relatedBy: .equal, toItem: progressBar, attribute: .width, multiplier: multiplier, constant: 0.0)
    constLblWidth.priority = .required
    lbl.translatesAutoresizingMaskIntoConstraints = false
    constLblWidth.isActive = true
    constLblWidth.identifier = "someIdentifier"
    self.view.layoutIfNeeded()
}

constLblWidth.isActive = true最初将约束添加到2个项目之间的共享父项,在这种情况下是self.view,因此当您删除约束时,应将其从self.view中删除,您可以通过打印验证这里的约束是我的编辑

的运行

enter image description here