所以我有一个随机生成一些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
。我已经有一个简短的使用这些功能,但无法获得预期的效果(可能是因为我错误地使用它们)
你们能指出我正确的方向来获得一条漂亮的曲线吗?
提前致谢
答案 0 :(得分: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 。