在Swift 3中顺时针旋转UIImage 270度的正确方法是什么?

UIView.animate(withDuration:2.0, animations: { self.imageView.transform = CGAffineTransform(rotationAngle: (270 * CGFloat(2 * Double.pi)) / 360.0) }) 

这是逆时针动画,我希望动画顺时针。

在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°) } 

传递负值将逆时针旋转。

顺时针旋转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)来执行完整旋转。

备注:

  • 要旋转大于180度的角度,您需要执行2次变换,一次用于前180度,然后另一次用于其余变换。
  • 要旋转大于360度的角度(如一个半圈),您需要执行三次变换。
  • 要旋转一个奇怪的角度,让我们说195度,首先旋转180度然后再旋转15度。
  • 在执行旋转时,您需要将度数转换为弧度。

说明

旋转的问题在于它找到了完成的最短路径。 因此,当您的视图在开始时旋转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是否处于“开始位置”。