我目前正在扩展类UIView
。我具有如下动画功能:
func rotate360(duration: TimeInterval) {
let rotationAnimation =
CABasicAnimation(keyPath:"transform.rotation")
rotationAnimation.fromValue = 0.0
rotationAnimation.toValue = CGFloat(2 * CGFloat.pi)
rotationAnimation.isRemovedOnCompletion = true
rotationAnimation.duration = duration
self.layer.add(rotationAnimation, forKey: nil)
}
然后我还有另一个功能来获取动画中的当前时间位置:
func currentRotationValue() -> Any? {
self.layer.presentation()
let value = self.layer.presentation()?.value(forKeyPath: "transform.rotation")
return value
}
由于某种原因,当我将下面的Any?
转换为CGFloat
时,有时会得到负数(好像数字溢出了)。如果溢出,则表示我使用的数据类型比CGFloat
更精确。我尝试将Any?
转换为Double来查看精度是否足够,但是我得到的值与CGFloat
相同。
这是我的代码,它采用视图值并将其转换为CGFloat:
var rotation = self.myView.currentRotationValue()
guard let rot = rotation as? CGFloat else {
return
}
var unscaledTime = rot / (CGFloat.pi * 2) * 3.0
print("\(unscaledTime) is sometimes negative")
我想可能是我将其缩放3可能会溢出。我的目标是精确保留我在旋转中的位置,然后将该值乘以3,因为这是旋转动画的时间段。
这是否意味着我需要使用一些任意精度数字以不超过内存存储的有效位数?
更新
实际上,该数字为负数,然后再对其进行任何算术运算。即在投放到CGFloat之后立即