gpt4 book ai didi

ios - 更改 NSLayoutConstraint 的常量

转载 作者:行者123 更新时间:2023-11-28 08:04:10 26 4
gpt4 key购买 nike

背景

我正在尝试使用动画和非动画选项进行相当标准的 NSLayoutConstraint 常量更新。为了给您一些背景知识,我有一个名为 ProgressView 的 UIView 子类。在 ProgressView 中,有 Progress Bar UIView。进度条 UIView 作为引用导出 progressBar 连接到 ProgressView 类。以下是 Storyboard 中相当简单的层次结构:

Storyboard hierarchy shows Progress Bar within Progress View

您可能已经猜到了,我正在构建一个自定义进度条。 ProgressView UIView 是“track”,Progress Bar UIView 是“fill”。计划是使用 Progress Bar UIView 的 trailing constraint 来改变进度。


现有配置

进度条 UIView 的约束设置为与 super View (进度 View )齐平:

Constraints

Progress Bar UIView 的尾部约束连接到 ProgressView 类作为一个强大的导出:@IBOutlet var trailingConstraint: NSLayoutConstraint!

在 ProgressView 类中,有一个 setProgress 函数。从包含 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,进度条填满整个轨道。

Filled bar


尝试过的解决方案

我已经尝试在每个有意义的位置和配置中调用 layoutIfNeeded()setNeedsLayout()(在 self [where self 是 ProgressView] 和 progressBar)。我已经尝试使用 DispatchQueue.main.async 将代码明确地放在主线程上。作为基本事实测试,我尝试将 trailingConstraint socket 连接到 ViewController 本身,并从 viewDidAppear()viewDidLayoutSubviews() 方法更新常量。什么都没用。


正确方向的可能提示

这是奇怪的部分。进度条显示在屏幕上,但当我调试 View 层次结构时,进度条看起来是正确的。 trailingConstraint 常量似乎已正确设置。

Correct bar

Correct constraints

我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com