gpt4 book ai didi

使用 Timer.scheduledTimer 的 Swift4 动画

转载 作者:行者123 更新时间:2023-11-28 07:44:21 28 4
gpt4 key购买 nike

我正在制作一个时钟指针的动画,它的 CGFloat 值从 0 到 1。虽然我有动画,但我希望它更流畅。作为输入变量的一部分,整个动画需要 5 秒。我怎样才能使这更顺利?

理想情况下,我想在 5 秒内获取从 0 到 1 的所有值...

时钟指针完成了 360 度旋转,但有点不稳定

@IBAction func start(_ sender: Any) {

timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(launchTimer), userInfo: nil, repeats: true)

launchTimer()
}

func launchTimer() {

guard seconds < 4.9 else {

timer.invalidate()
seconds = 0

return
}

seconds += 0.1

clockView.currentPressure = CGFloat(seconds / 5)
clockView.setNeedsDisplay()

}

编辑

import UIKit

class GaugeView: UIView {

var currentPressure : CGFloat = 0.0

override func draw(_ rect: CGRect) {
StyleKitName.drawGauge(pressure: currentPressure)
}
}

最佳答案

Timer 不适用于这种规模的动画。 100 毫秒在任何情况下都不是一个好的步骤,因为它不是帧速率 (16.67 毫秒) 的倍数。一般来说,除非您有专门的问题,否则您不应该尝试手动制作动画。请参阅 UIView.animate(withDuration:...),这通常是您应该如何为 UI 元素设置动画,让系统为您处理进度。

对于稍微更手动的动画,请参阅 CABasicAnimation,它将随时间更新属性。如果您需要非常手动的控制,请参阅 CADisplayLink,但您几乎不需要它。

在任何情况下,您都不能假设任何计时器都在您要求时被准确调用。你不能仅仅因为你要求在 0.1 秒内被调用而将 0.1 秒添加到一个值。你得看看现在几点了。即使是硬实时系统也不能保证会在精确的时刻调用某些东西。您可能得到的最好的 promise 是它会在一定的公差范围内(而 iOS 甚至没有给您)。


要使用 UIView(我推荐)对此进行动画处理,它可能类似于:

@IBAction func start(_ sender: Any) {
self.clockView.currentPressure = 0
UIView.animate(withDuration: 5, animations: {
self.clockView.currentPressure = 1
})
}

使用 CABasicAnimation(更复杂)它会是这样的:

currentPressure = 1 // You have to set it to where it's going or it'll snap back.
let anim = CABasicAnimation(keyPath: "currentPressure")
anim.fromValue = 0
anim.toValue = 1
anim.duration = 5
clockView.addAnimation(anim)

关于使用 Timer.scheduledTimer 的 Swift4 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51481735/

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