Iphone 如何使视图沿倒抛物线的路径移动?

Iphone 如何使视图沿倒抛物线的路径移动?,iphone,ios,objective-c,core-graphics,core-animation,Iphone,Ios,Objective C,Core Graphics,Core Animation,我有一条倒抛物线,我需要一个视图穿过抛物线的路径。视图应该沿着抛物线的路径稍微旋转和平移 我做了一些研究,发现BezierPath(带控制点的四边形曲线)可以用来绘制抛物线的路径,然后我们可以使用动画沿路径移动对象。沿抛物线路径设置视图对象的动画让我感到困惑。 如何在抛物线内不断更改对象的起点并保留视图的最新状态 下面是我希望通过抛物线视图实现的一个简要描述 视图从抛物线中的特定点开始,然后穿过抛物线直到指定的端点。 如何找出抛物线内的端点? 一旦视图到达其终点。对于下一次遍历,它可以从该点开始

我有一条倒抛物线,我需要一个视图穿过抛物线的路径。视图应该沿着抛物线的路径稍微旋转和平移

我做了一些研究,发现BezierPath(带控制点的四边形曲线)可以用来绘制抛物线的路径,然后我们可以使用动画沿路径移动对象。沿抛物线路径设置视图对象的动画让我感到困惑。 如何在抛物线内不断更改对象的起点并保留视图的最新状态

下面是我希望通过抛物线视图实现的一个简要描述

视图从抛物线中的特定点开始,然后穿过抛物线直到指定的端点。 如何找出抛物线内的端点? 一旦视图到达其终点。对于下一次遍历,它可以从该点开始,然后移动到抛物线内的任何其他点。这将基于下一个终点连续发生

这是一个粗略的草图,路径和视图是什么样子的

我还希望,通过路径的视图的旋转和平移同时发生

如何做到这一点

谢谢大家!

  • 使用UIBezierPath绘制抛物线,并将其转换为CGPath或创建CGPath
  • 使用CAKeyFrameAnimation移动UIView的位置
请看下面的源代码

绘制抛物线

CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path,NULL,50.0,120.0);

CGPathAddCurveToPoint(path,NULL,50.0,275.0,
                      150.0,275.0,
                      150.0,120.0);
CGPathAddCurveToPoint(path,NULL,150.0,275.0,
                      250.0,275.0,
                      250.0,120.0);    
CGPathAddCurveToPoint(path,NULL,250.0,275.0,
                      350.0,275.0,
                      350.0,120.0);    
CGPathAddCurveToPoint(path,NULL,350.0,275.0,
                      450.0,275.0,
                      450.0,120.0);
沿路径的关键帧动画

CAKeyframeAnimation* AniLoc = [CAKeyframeAnimation animationWithKeyPath:@"position"]; // notice key change

// rest is the same
AniLoc.path = thePath;
AniLoc.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
AniLoc.keyTimes= [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f],
                  [NSNumber numberWithFloat:0.3f],
                  [NSNumber numberWithFloat:1.0f],nil];
AniLoc.duration = 2.0;

CFRelease(thePath);

[self.logo.layer addAnimation:AniLoc forKey:nil];

您已经知道了动画,请尝试一下。数学是关于如何知道路径上特定点的另一部分的答案。@Wain我可以在CAKeyFrameAnimation中指定视图的起点和终点吗?我希望仅在抛物线上的某些点之间移动视图。。我正在寻找一种方法来指定起点和终点,这样我就可以只在路径上的这些点之间设置平移。。有没有一种方法可以使用CAKeyFrameAnimation实现这一点?您希望绘制抛物线,但在抛物线内从起点移动到终点。不是吗?。如果你知道从何处开始和结束,你可以用点本身来构建你的CGPath。所以这就像在抛物线路径内创建一个小的子路径,对吗?但是,在抛物线路径内动态创建这样的子路径,只是为了移动到一个终点,难道不会像我使用贝塞尔路径创建控制点那样复杂吗弧线。。难道没有更简单的方法吗?我想CAKeyFrameAnimation会有某种功能,可以让我指定在抛物线内的两点之间精确移动视图的位置pathOne还有一件事我不会使用CGPath来构造路径,原因有两个I)我不希望路径可见ii)我没有在子类的drawRect中做这些事情看法由于不需要查看路径,我只好使用BezierPath。。如果我错了,请纠正我@匿名先生:CGPath不需要你画。这只是一个Bézier路径的CG实现。您可以使用该路径来描述运动,而不是像Vignesh的代码那样描述轮廓。