Ios CGAffineTransformMakeRotation与负M_PI

Ios CGAffineTransformMakeRotation与负M_PI,ios,swift,uiview,ios8,cgaffinetransform,Ios,Swift,Uiview,Ios8,Cgaffinetransform,我正在使用cGraffineTransformMakeRotation在动画块内旋转UIView,我想逆时针旋转180º 但是当我把 myView.animateWithDuration(0.5) myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI)) 它仍然顺时针旋转。让我困惑的是,如果我“手动”编写M_PI的值,它会按预期工作 // this will rotate counterclockwise myView

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

但是当我把

myView.animateWithDuration(0.5)
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI))
它仍然顺时针旋转。让我困惑的是,如果我“手动”编写
M_PI
的值,它会按预期工作

 // this will rotate counterclockwise
 myView.transform = CGAffineTransformMakeRotation(CGFloat(-3.14159265358979))
为什么会有这种行为


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

据我所知,您正在尝试在动画块内旋转视图
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

正如我所理解的,您正在尝试在动画块中旋转视图
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

,正如我在第一篇评论中所说的,正如Segii所写的那样:动画将在其当前值和尝试去的位置之间走最短的距离。imho的最佳解决方案是使用
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
是起始角度->0。然后旋转将以逆时针方向180度旋转。

正如我在第一篇评论中所说的和Segii已经写过的:动画将在它的值现在所在的位置和它试图去的位置之间走最短的距离。imho的最佳解决方案是使用
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
是起始角度->0。然后,旋转将沿距离
(toValue-fromValue)=0-M_PI=-M_PI
->逆时针旋转180度。

我无法在objective-c或swift中复制您的问题,始终顺时针旋转-旋转-3.141592会产生所需的效果。我无法在objective-c或swift中复制您的问题,始终顺时针旋转-旋转-3.141592会产生所需的效果。由于某些原因,这对我不起作用。此外,我还使用了
CGFloat.pi
,因为这是swift 3.0M_-pi和-m_-pi的首选,对我来说不起作用,但是从CGAffineTransformMakeRotation值中减去/添加0.01可以为动画创建最短的距离,但从视觉上看,你看不出有什么区别。出于某种原因,这对我不起作用。此外,我还使用了
CGFloat.pi
,因为这是swift 3.0M_-pi和-m_-pi的首选,但对cgaffinetTransformMakeRotation值减去/添加0.01可以创建动画所需的最短距离,但视觉上看不到任何差异。