CGAffineTransform MakeRotation 负 M_PI
CGAffineTransformMakeRotation with negative M_PI
我正在使用 CGAffineTransformMakeRotation
在动画块中旋转 UIView
,我想将它逆时针旋转 180º
。
然而当我把
myView.animateWithDuration(0.5)
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI))
它仍然顺时针旋转。令我困惑的是,如果我写 "manually" 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
正如我在第一条评论中所述以及 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
是起始角度->0。然后旋转距离(toValue - fromValue) = 0 - M_PI = - M_PI
->逆时针旋转180度。
我正在使用 CGAffineTransformMakeRotation
在动画块中旋转 UIView
,我想将它逆时针旋转 180º
。
然而当我把
myView.animateWithDuration(0.5)
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI))
它仍然顺时针旋转。令我困惑的是,如果我写 "manually" 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
正如我在第一条评论中所述以及 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
是起始角度->0。然后旋转距离(toValue - fromValue) = 0 - M_PI = - M_PI
->逆时针旋转180度。