UIView.animate(withDuration:2.0, animations: {
self.imageView.transform = CGAffineTransform(rotationAngle: (270 * CGFloat(2 * Double.pi)) / 360.0)
})
这是逆时针方向的动画我想要顺时针动画。
答案 0 :(得分:4)
顺时针旋转270度......
UIView.animate(withDuration:2.0, animations: {
self.sampleView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi))
self.sampleView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi * 3 / 2))
})
核心动画总是采用最短的路线来进行旋转。因此,如果你的物体是直的并且旋转到90度(弧度:pi / 2),它将顺时针旋转。如果你的物体是直的并且旋转到270度(弧度:pi + pi / 2 = 3pi / 2),它将逆时针旋转,因为它是最小的动画。
因此我们首先需要通过pi弧度旋转(从0 - > pi,0 - > 180)然后旋转另一个pi / 2弧度(pi - > 3pi / 2,180 - > 270)到执行完整的旋转。
注意:
答案 1 :(得分:3)
在iOS中,坐标系被翻转。因此,顺便提一下你的学位。这意味着通过270°会给你一个角度,相当于标准坐标系中的90°。记住这一点并相应地提供所需的角度。
考虑以下方法。
1)角度的方便扩展
{
_id: objectid,
user: objectid,
company: objectid,
groups:[
{items:['b']}, {items:['d']}
]
}
2)使用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
}
}
:
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")
}
}
传递负值将逆时针旋转。
答案 2 :(得分:2)
<强>解释强>
轮换的问题在于它找到了完成的最短路径。 因此,当您的视图在开始时旋转0度时,到270度的最短路径将视图旋转-90度。
你必须结合两个动画才能做到这一点。
第一: 将视图旋转180 + 1度 (加1告诉动画你想要顺时针旋转 - 更短的路径)
第二: 将视图旋转90度
代码:
假设您有一个名为rotateView的UIView。
@objc func rotate() {
if rotateView.transform == .identity {
UIView.animate(withDuration: 0.5) {
self.rotateView.transform = CGAffineTransform(rotationAngle: (CGFloat.pi) + 1)
}
UIView.animate(withDuration: 0.5, delay: 0.25, options:[], animations: {
self.rotateView.transform = CGAffineTransform(rotationAngle: (CGFloat.pi / 2))
}, completion: nil)
} else {
UIView.animate(withDuration: 0.5, animations: {
self.rotateView.transform = .identity
})
}
}
.identity会检查您的rotateView是否处于“开始位置”。