顺时针图像旋转动画
Clockwise image rotation animation
我有一个动画,它应该不断旋转图像。但是它有几个问题。速度很奇怪,尽管我将它设置为不断重复,但您可以看到它是如何开始、停止然后重复的。这不应该发生。它应该是不间断的旋转。
另外,另一个问题是当动画停止时,图像由于某种原因向左移动。
这是我的代码:
func animateLogo()
{
UIView.animate(withDuration: 6.0, delay: 0.0, options: .repeat, animations: {
self.logo.transform = CGAffineTransform(rotationAngle: ((180.0 * CGFloat(Double.pi)) / 180.0))
}, completion: nil)
}
试试这个
func rotateView(targetView: UIView, duration: Double = 1.0) {
UIView.animate(withDuration: duration, delay: 0.0, options: .curveLinear, animations: {
targetView.transform = targetView.transform.rotated(by: CGFloat(M_PI))
}) { finished in
self.rotateView(targetView: YOUR_LOGO, duration: duration)
}
}
如何使用
self.rotateView(targetView: YOUR_LOGO, duration: duration)
在iOS中坐标系翻转。因此,随着学位的增加,您顺时针方向前进。就是说经过270°就会得到一个角度,相当于标准坐标系中的90°。请记住这一点并相应地提供所需的角度。
考虑以下方法。
1) 方便的角度扩展
postfix operator °
protocol IntegerInitializable: ExpressibleByIntegerLiteral {
init (_: Int)
}
extension Int: IntegerInitializable {
postfix public static func °(lhs: Int) -> CGFloat {
return CGFloat(lhs) * .pi / 180
}
}
extension CGFloat: IntegerInitializable {
postfix public static func °(lhs: CGFloat) -> CGFloat {
return lhs * .pi / 180
}
}
2) 用CABasicAnimation旋转任意角度:
extension UIView {
func rotateWithAnimation(angle: CGFloat, duration: CGFloat? = nil) {
let pathAnimation = CABasicAnimation(keyPath: "transform.rotation")
pathAnimation.duration = CFTimeInterval(duration ?? 2.0)
pathAnimation.fromValue = 0
pathAnimation.toValue = angle
pathAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
self.transform = transform.rotated(by: angle)
self.layer.add(pathAnimation, forKey: "transform.rotation")
}
}
用法:
override func viewDidAppear(_ animated: Bool) {
// clockwise
myView.rotateWithAnimation(angle: 90°)
// counter-clockwise
myView.rotateWithAnimation(angle: -270°)
}
传递负值将旋转 counter-clockwise。
角度应以弧度而不是度数为单位。以弧度为单位的角度 = 度 * pi / 180。所以如果你想旋转 360 度,你应该输入弧度 = 360 * pi / 180 = 2 * pi = 2 * 3.1415 = 6.283.
我有一个动画,它应该不断旋转图像。但是它有几个问题。速度很奇怪,尽管我将它设置为不断重复,但您可以看到它是如何开始、停止然后重复的。这不应该发生。它应该是不间断的旋转。 另外,另一个问题是当动画停止时,图像由于某种原因向左移动。
这是我的代码:
func animateLogo()
{
UIView.animate(withDuration: 6.0, delay: 0.0, options: .repeat, animations: {
self.logo.transform = CGAffineTransform(rotationAngle: ((180.0 * CGFloat(Double.pi)) / 180.0))
}, completion: nil)
}
试试这个
func rotateView(targetView: UIView, duration: Double = 1.0) {
UIView.animate(withDuration: duration, delay: 0.0, options: .curveLinear, animations: {
targetView.transform = targetView.transform.rotated(by: CGFloat(M_PI))
}) { finished in
self.rotateView(targetView: YOUR_LOGO, duration: duration)
}
}
如何使用
self.rotateView(targetView: YOUR_LOGO, duration: duration)
在iOS中坐标系翻转。因此,随着学位的增加,您顺时针方向前进。就是说经过270°就会得到一个角度,相当于标准坐标系中的90°。请记住这一点并相应地提供所需的角度。
考虑以下方法。
1) 方便的角度扩展
postfix operator °
protocol IntegerInitializable: ExpressibleByIntegerLiteral {
init (_: Int)
}
extension Int: IntegerInitializable {
postfix public static func °(lhs: Int) -> CGFloat {
return CGFloat(lhs) * .pi / 180
}
}
extension CGFloat: IntegerInitializable {
postfix public static func °(lhs: CGFloat) -> CGFloat {
return lhs * .pi / 180
}
}
2) 用CABasicAnimation旋转任意角度:
extension UIView {
func rotateWithAnimation(angle: CGFloat, duration: CGFloat? = nil) {
let pathAnimation = CABasicAnimation(keyPath: "transform.rotation")
pathAnimation.duration = CFTimeInterval(duration ?? 2.0)
pathAnimation.fromValue = 0
pathAnimation.toValue = angle
pathAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
self.transform = transform.rotated(by: angle)
self.layer.add(pathAnimation, forKey: "transform.rotation")
}
}
用法:
override func viewDidAppear(_ animated: Bool) {
// clockwise
myView.rotateWithAnimation(angle: 90°)
// counter-clockwise
myView.rotateWithAnimation(angle: -270°)
}
传递负值将旋转 counter-clockwise。
角度应以弧度而不是度数为单位。以弧度为单位的角度 = 度 * pi / 180。所以如果你想旋转 360 度,你应该输入弧度 = 360 * pi / 180 = 2 * pi = 2 * 3.1415 = 6.283.