背景
我正在尝试使用动画和非动画选项进行相当标准的NSLayoutConstraint常量更新。为了给你一些背景知识,我有一个名为ProgressView的UIView子类。在ProgressView中,有一个进度条UIView。进度条UIView作为引用出口连接到ProgressView类。以下是故事板中相当简单的层次结构的外观:
你可能已经猜到了,我正在建立一个自定义进度条。ProgressView ui视图是“track”,进度条ui视图是“fill”,计划是使用进度条ui视图的尾部约束来更改进度。
现有配置
进度条UIView的约束设置为与superview(进度视图)齐平:
进度条UIView的尾随约束作为一个强出口连接到ProgressView类:progressBar
。
在ProgressView类中,有一个@IBOutlet var trailingConstraint: NSLayoutConstraint!
函数。此函数从包含ProgressView的ViewController调用。下面是解释其工作原理的注释函数:
public func setProgress(_ progress: Double, animationDuration: Double) {
// Pre-conditions
guard progress >= 0.0 && progress <= 1.0 && animationDuration >= 0.0 else {
return
}
// Calculate the new constraint constant based on the progress
let newConstant = CGFloat(1 - progress) * self.bounds.size.width
// If the update should be made without animation, just make the change and return
guard animationDuration > 0.0 else {
trailingConstraint.constant = newConstant
return
}
// Set the constraint first
self.trailingConstraint.constant = newConstant
// Animate!
UIView.animate(withDuration: animationDuration) {
self.layoutIfNeeded()
}
}
问题
如您所见,此函数可以在有动画和无动画的情况下更新进度。但是,从ViewController调用时,两者都不起作用。尾随约束常量似乎保持为0,进度条将填充整个轨迹。
尝试的解决方案
我试过在每个有意义的位置和配置(在
setProgress
[其中layoutIfNeeded()
是ProgressView]和setNeedsLayout()
上)调用self
和self
。我试着用progressBar
将代码显式地放在主线程上。作为地面真实性测试,我尝试将trailingConstraint出口连接到ViewController本身,并从DispatchQueue.main.async
和viewDidAppear()
方法更新常量。什么都不管用。一个可能的正确方向的暗示
奇怪的是。进度条在屏幕上显示为已填充,但是当我调试视图层次结构时,进度条看起来是正确的。trailingConstraint常量似乎设置正确。
我在一个iOS 10设备上测试并运行Xcode 8.3.3。这个问题对我来说真的很奇怪,我不太确定从这里该怎么办。谢谢你的帮助。
最佳答案
我也面临同样的问题。我的问题是通过改变动画中的常量来解决的。试试这个:
UIView.animate(withDuration: 0.2) {
self.trailingConstraint.constant = newConstant
self.layoutIfNeeded()
}
关于ios - 更改NSLayoutConstraint的常量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45666973/