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