gpt4 book ai didi

ios - Swift - 完成在动画完成之前结束

转载 作者:可可西里 更新时间:2023-11-01 00:56:15 27 4
gpt4 key购买 nike

我目前遇到的问题是动画功能的完成在动画本身完成之前就结束了。

数组 progressBar[] 包含多个 UIProgressViews。当一个完成动画后,我希望下一个开始动画等等。但现在他们都同时开始了。
我怎样才能解决这个问题?

@objc func updateProgress() {

if self.index < self.images.count {
progressBar[index].setProgress(0.01, animated: false)
group.enter()

DispatchQueue.main.async {
UIView.animate(withDuration: 5, delay: 0.0, options: .curveLinear, animations: {
self.progressBar[self.index].setProgress(1.0, animated: true)
}, completion: { (finished: Bool) in
if finished == true {
self.group.leave()
}
})
}
group.notify(queue: .main) {
self.index += 1
self.updateProgress()
}
}
}

最佳答案

问题是 UIView.animate() 只能用于动画属性,而 progress 不是动画属性。 “Animatable”在这里的意思是“可以通过 Core Animation 在外部设置动画”。 UIProgressView 有自己的内部动画,这与外部动画有冲突。这是 UIProgressView 有点过于聪明,但我们可以解决它。

UIProgressView 确实使用了 Core Animation,因此会触发 CATransaction 完成 block 。但是,它不遵守当前 CATransaction 的持续时间,我觉得这很困惑,因为它确实遵守当前 UIView 动画的持续时间。我实际上不确定这两者是如何真实的(我认为 UIView 动画持续时间将在事务上实现),但似乎是这样。

鉴于此,执行您正在尝试的操作的方法如下所示:

func updateProgress() {
if self.index < self.images.count {
progressBar[index].setProgress(0.01, animated: false)

CATransaction.begin()
CATransaction.setCompletionBlock {
self.index += 1
self.updateProgress()
}
UIView.animate(withDuration: 5, delay: 0, options: .curveLinear,
animations: {
self.progressBar[self.index].setProgress(1.0, animated: true)
})
CATransaction.commit()
}
}

我在这里创建了一个嵌套事务(使用开始/提交),以防万一在此事务期间创建了一些其他完成 block 。这不太可能,并且代码在不调用 begin/commit 的情况下“工作”,但这种方式比扰乱默认事务要安全一些。

关于ios - Swift - 完成在动画完成之前结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47633787/

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