5

我正在使用跟随 CGPathAddEllipseInRect 的 CAKeyframeAnimation 沿圆圈为 UIView 设置动画。但是,无论视图最初位于哪个框架中,视图似乎总是从同一个位置开始。有什么方法可以调整路径上视图的起始位置吗?

谢谢!

CAKeyframeAnimation *myAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
myAnimation.fillMode = kCAFillModeForwards;
myAnimation.repeatCount = 5;
myAnimation.calculationMode = kCAAnimationPaced;
myAnimation.duration = 10.0;

CGMutablePathRef animationPath = CGPathCreateMutable();

CGPathAddEllipseInRect(animationPath, NULL, rect);

myAnimation.path = animationPath;
CGPathRelease(animationPath);

[view.layer addAnimation:myAnimation forKey:@"changeViewLocation"];
4

2 回答 2

0

以前的答案是正确的并且有效,但应该有

CGFloat startVal = M_PI / 2;

代替

NSInteger startVal = M_PI / 2;

否则,M_PI 将四舍五入为整数,您将无法获得准确的角度。PS评论先前的答案的声誉很低,对不起。

于 2013-12-10T08:47:17.937 回答
0

我认为不可能为 CGPathAddEllipseInRect 设置起点。(至少我没有成功)

而不是使用:CGPathAddEllipseInRect,你应该使用:CGPathAddArc!例如:

CAKeyframeAnimation *myAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
myAnimation.fillMode = kCAFillModeForwards;
myAnimation.repeatCount = 5;
myAnimation.calculationMode = kCAAnimationPaced;
myAnimation.duration = 10.0;

CGMutablePathRef animationPath = CGPathCreateMutable();

NSInteger startVal = M_PI / 2;

//seventh value (end point) must be always 2*M_PI bigger for a full circle rotation
CCGPathAddArc(animationPath, NULL, 100, 100, 100,  startVal, startVal + 2*M_PI, NO); 

myAnimation.path = animationPath;
CGPathRelease(animationPath);

[view.layer addAnimation:myAnimation forKey:@"changeViewLocation"];

将从底部开始旋转一整圈 - 顺时针。更改 startVal 值以更改旋转开始位置。(完全旋转为 2*M_PI)。

于 2011-11-01T14:09:44.003 回答