为CGAffineTransform设置Start Point

时间:2011-01-23 01:05:10

标签: quartz-graphics cgpath cakeyframeanimation

我使用跟随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"];

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:0)

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

CGFloat startVal = M_PI / 2;

而不是

NSInteger startVal = M_PI / 2;

否则,M_PI将四舍五入为整数,您将无法获得准确的角度。 附:对于评论上一个答案的声誉很低,抱歉。