在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是否处于“开始位置”。