具有负M_PI的CGAffineTransformMakeRotation

时间:2015-06-23 15:37:03

标签: ios swift uiview ios8 cgaffinetransform

我正在使用CGAffineTransformMakeRotation在动画块内旋转UIView,我想逆时针旋转180º

然而,当我把

myView.animateWithDuration(0.5)
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI))

它仍然顺时针旋转。令我困惑的是,如果我“手动”写下M_PI的值,它会按预期工作

 // this will rotate counterclockwise
 myView.transform = CGAffineTransformMakeRotation(CGFloat(-3.14159265358979))

为什么会出现这种情况?

编辑:添加我正在使用动画块

2 个答案:

答案 0 :(得分:9)

正如我在第一篇评论中所说,并且Segii已经写过:动画将采用它现在的价值和试图去的地方之间的最短距离。最好的解决方案是使用CABasicAnimation强制逆时针旋转:

let anim = CABasicAnimation(keyPath: "transform.rotation")
anim.fromValue = M_PI
anim.toValue = 0
anim.additive = true
anim.duration = 2.0

myView.layer.addAnimation(anim, forKey: "rotate")
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI))

这将一次逆时针旋转180度。

您在最后一行指定的角度+ fromValue是起始角度 - >然后旋转将移动距离(toValue - fromValue) = 0 - M_PI = - M_PI - >逆时针180度旋转。

答案 1 :(得分:5)

据我了解,您正在尝试在动画块中旋转视图。 animateWithDuration将始终以最短的方式执行动画。因此,M_PI和-M_PI给出相同的目标位置。原因是,为什么在手动设置时获得预期的动画方向是您的手动值实际上小于M_PI,因此最短的旋转方式是逆时针方向。

要获得预期的行为,您必须链接至少两个动画, 分裂你的旋转角度。例如

//first animation block
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI/2))CGAffineTransformMakeRotation;
//second animation block
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI/2))CGAffineTransformMakeRotation;

Swift 3.0

myView.transform = CGAffineTransform(rotationAngle: CGFloat(-M_PI/2))

或者,更可靠的是,使用CAKeyframeAnimation