6

我正在尝试组合几张UIBezierPath图纸。

我可以制作不同类型的图纸(线条、三次贝塞尔曲线、二次贝塞尔曲线),并且每一种都可以填充或不填充。我随机选择绘图类型,我的目标是制作 3 个不同的绘图,它们在一个点连接。

因此,在第一条线画结束的地方,第二条路径——也许是三次贝塞尔曲线——开始了。在这结束的地方,第三个,也许是一个填充的线条图开始了。

我有一个正方形UIView,我想把它画进去,每条路径都应该有它自己的部分UIView:第一个 1/3,第二个和第三个。

我可以用一个UIBezierPath对象创建它,还是需要创建 3 个不同的对象?如何使它们在同一点结束和开始?有没有办法用子路径做到这一点?

4

3 回答 3

9

UIBezierPath 有它的实例方法,比如(DOC

  • -addLineToPoint:
  • -addArcWithCenter:radius:startAngle:endAngle:clockwise:
  • -addCurveToPoint:controlPoint1:controlPoint2:
  • -addQuadCurveToPoint:controlPoint:
  • -appendPath:

您可以一一组合路径。完成后,使用-closePath关闭路径。

随意看看我的开源库UIBezierPath-Symbol。;)


如果您想要更多自定义路径绘图,我建议您使用CGMutablePath. 您可以根据需要创建每个复杂的路径(您可以通过CGPathAdd...方法组合简单的路径)。最后,使用CGPathAddPath()将它们组合在一起。

void CGPathAddPath (  
  CGMutablePathRef path1,     // The mutable path to change.
  const CGAffineTransform *m, // A pointer to an affine transformation matrix, or NULL if no transformation is needed. If > specified, Quartz applies the transformation to path2 before it is added to path1.
  CGPathRef path2             // The path to add.
);
于 2013-05-11T05:50:47.827 回答
5

您可以像这样组合路径:

UIBezierPath *endPath = [UIBezierPath bezierPath];
[endPath appendPath:leftLine];
[endPath appendPath:rightLine];
[endPath appendPath:midLine];

贝塞尔路径箭头示例

于 2016-02-10T15:03:25.593 回答
3

UIBezierPath 只是 CGPath 的包装,它本身只是一组绘图指令(通过描边或填充,或两者兼而有之)。该绘图可以在任何地方进行。换句话说,UIBezierPath 只是一个绘图工具;重要的是绘图本身。给定一个图形上下文(可能是一个 UIView、一个 UIImage、一个 CALayer 等等),您可以连续绘制尽可能多的绘图 - 比如说,一条线,然后是三次贝塞尔曲线,然后是实心线图。但是如何执行这些绘图位完全取决于您。你不应该真的在乎无论您是使用三个 UIBezierPath、一个 UIBezierPath、多个路径、一个路径、子路径还是其他任何方式(甚至通过将其他图形复制到该图形中)-最终效果才是最重要的,即最终在此图形上下文中完成的累积图形.

你的问题就像在问,“我应该用右手还是左手画这个圆圈,我应该逆时针还是顺时针画?” 没关系。完成后,将绘制一个圆圈;这才是重要的。

于 2013-05-11T04:40:42.723 回答