В настоящее время я продлен класс 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, так как это период времени анимации вращения.
Значит ли это, что мне нужно использовать произвольное число точности, чтобы не превысить значение хранилища памяти?
UPDATE
на самом деле число отрицательное, прежде чем я сделаю какие-либо арифметические операции над ним а именно сразу после заброса на CGFloat