4

所以我有一个随机生成一些 CGPoints 的函数,然后我从这些点创建一个 CGPath。我在关键帧动画中使用此路径为屏幕周围的视图设置动画。

使用以下代码生成路径:

- (CGMutablePathRef)generatePathFromCoordinates:(NSArray *)coordinates
{
    CGMutablePathRef path = CGPathCreateMutable();
    CGPoint point = [(NSValue *)[coordinates objectAtIndex:0] CGPointValue];
    CGPathMoveToPoint(path, nil, point.x, point.y);

    for (int i=1; i < coordinates.count; i++)
    {
        point = [(NSValue *)[coordinates objectAtIndex:i] CGPointValue];
        CGPathAddLineToPoint(path, nil, point.x, point.y);
    }

    return path;   
}

上面的代码效果很好,但是动画看起来有点奇怪,所以我想在坐标之间添加一条曲线而不是直线。就像下面的图片(我知道惊人的绘画技巧!)。路径“A”是我目前正在做的,路径“B”是我的目标:

在此处输入图像描述

在查看了 CGPath 参考中可用的函数后,我可以看到一些可以完成工作的函数,CGPathAddArcToPoint CGPathAddCurveToPoint. 我对使用这些功能进行了简短的尝试,但无法获得预期的效果(可能是因为我使用不正确)

你们能指出我正确的方向以实现漂亮的曲线吗?

提前致谢

4

1 回答 1

1

CGPathAddCurveToPoint将三次曲线添加到贝塞尔路径。在您不知道的情况下,它的制作方式是曲线的形状由两个控制点确定(使用曲线的三年级方程)。如果你想让曲线有一个特定的形状,那么你需要计算两个中间点,偏向于路径当前点的值,以及曲线的终点。相反,如果您不关心具有特定形状的曲线,则可以选择一些随机点。这是一个实现示例:

for (int i=1; i < coordinates.count; i++)
{
    point = [[coordinates objectAtIndex:i] CGPointValue];
    CGPathAddCurveToPoint(path, 0, randomX(), randomY(), randomX(), randomY(), point.x, point.y);
}

我看到您使用了CGPath ,但如果您发现它更易于使用,您也可以将 OOP 与UIBezierPath一起使用而不是CGPath 。

于 2013-06-18T20:52:14.870 回答