我正在使用NSLayoutConstraint
进行测试,发现每次都不会更新布局
这是我ViewController
的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()
}
我有什么东西可以让我更新布局吗? 请帮我解决这个问题 每次更新ProgressBar标签也应该增加其宽度。
我还尝试通过以下声明更新布局。
self.view.layoutIfNeeded()
self.view.layoutSubviews()
答案 0 :(得分:1)
问题出在这里
lblProgress.removeConstraint(constraints)
应该从lblProgress
和progressBar
的父级删除约束
因为约束在他们之间
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中删除,您可以通过打印验证这里的约束是我的编辑