如何组合UIBezierPath图纸?

时间:2013-05-11 04:25:06

标签: ios6 uibezierpath cgpath

我正在尝试合并多个UIBezierPath图纸。

我可以制作不同类型的图纸(直线,立方贝塞尔曲线,二次贝塞尔曲线),并且每个都可以填充或未填充。我随机选择了绘图类型,我的目标是制作3个不同的绘图,这些绘图在一个点连接。

所以第一条线,例如线条图结束,第二条路径 - 也许是一个立方贝塞尔曲线 - 开始。在那里结束,第三个,也许是一个填充的线条画开始。

我有一个正方形UIView,我正试图将其绘制成每个路径应该有UIView的一部分:第一个1/3,第二个和第三

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

3 个答案:

答案 0 :(得分:8)

UIBezierPath的实例方法如(DOC

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

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

请随意查看名为UIBezierPath-Symbol的开源lib。 ;)


如果您想要更多自定义路径绘制,我建议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.
);

答案 1 :(得分:3)

您可以组合这样的路径:

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

bezier path arrow example

答案 2 :(得分:1)

UIBezierPath只是CGPath的包装器,它本身只是一组绘图指令(通过笔划或填充,或两者兼而有之)。那幅画可以在任何地方进行。换句话说,UIBezierPath只是一个绘图工具;重要的是绘图本身。给定一个图形上下文(可能是UIView,UIImage,CALayer,等等),你可以连续绘制尽可能多的绘图 - 例如,一条线,然后是一个立方贝塞尔曲线,然后是一个填充的线条图。但如何你执行这些绘图位完全取决于你。你不应该真的关心你是否用三个UIBezierPaths,一个UIBezierPath,多个路径,一个路径,子路径,等等(或者甚至通过将其他图纸复制到这个中)来做 - 最后的效果是全部这很重要,即累积的绘图最终在此图形上下文中完成。

你的问题就像是问:“我应该用右手还是左手画这个圆圈,我应该逆时针或顺时针画它?”没关系。一旦完成,将会画出一个圆圈;这才是最重要的。