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

时间:2017-10-26 06:25:25

标签: ios swift swift3

UIView.animate(withDuration:2.0, animations: {

         self.imageView.transform = CGAffineTransform(rotationAngle: (270 * CGFloat(2 * Double.pi)) / 360.0)
    })

这是逆时针方向的动画我想要顺时针动画。

3 个答案:

答案 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)到执行完整的旋转。

注意:

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

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