我正在使用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))
为什么会出现这种情况?
编辑:添加我正在使用动画块
答案 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