CGAffineTransformMakeRotation负M_PI

我正在使用CGAffineTransformMakeRotation来旋转一个animation块内的UIView ,我想逆时针旋转180º

但是,当我把

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

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

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

为什么这种行为?

编辑:添加我正在使用animation块

正如我在我的第一个评论中所说的那样,Segii已经写道:animation将在现在和现在的价值之间达到最短的距离。 最好的解决scheme是使用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指定的angular度是起始angular度 – > 0。然后旋转将(toValue - fromValue) = 0 - M_PI = - M_PI距离(toValue - fromValue) = 0 - M_PI = - M_PI – >逆时针180度旋转。

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

为了得到预期的行为,你必须链接至less两个animation,分裂你的旋转angular度。 例如

 //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