如何合并UIBezierPath绘制?

8
我正在尝试合并几个UIBezierPath图案。
我可以绘制不同类型的图案(线条、立方体贝塞尔曲线、二次贝塞尔曲线),每种图案都可以填充或不填充。我会随机选择绘制类型,我的目标是制作3个不同的图案,它们在一个点连接起来。
所以第一个(比如说)线条图案结束的地方,第二个路径——可能是一个立方体贝塞尔曲线——开始。当它结束时,第三个可能是填充线条图案开始。
我有一个正方形UIView,我想在其中绘制这个图案,每个路径应该有自己的UIView部分:第一部分、第二部分和第三部分。
我能否使用一个UIBezierPath对象创建此图案,还是需要创建3个不同的对象?如何使它们在同一点结束和开始?是否可以使用子路径完成这个功能?
3个回答

10

UIBezierPath有一些实例方法,例如 (DOC):

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

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

如果您想要更多的自定义路径绘制,我推荐使用CGMutablePath. 您可以创建任意复杂的路径(可以通过CGPathAdd...方法组合简单路径),最后使用CGPathAddPath()将它们组合在一起。

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

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.
);

5
您可以像这样组合路径:
UIBezierPath *endPath = [UIBezierPath bezierPath];
[endPath appendPath:leftLine];
[endPath appendPath:rightLine];
[endPath appendPath:midLine];

bezier path arrow example


3
一个UIBezierPath只是一个CGPath的包装器,而CGPath本身只是一组绘制指令(通过描边、填充或两者都可以)。这种绘制可以在任何地方进行。换句话说,UIBezierPath只是一种绘图工具;重要的是绘图本身。给定一个图形上下文(可能是UIView、UIImage、CALayer等),您可以按顺序进行任意数量的绘图——例如,先画一条直线,然后是一个三次贝塞尔曲线,再是一条填充线条。但是如何执行这些绘图部分完全取决于您。您不应该真正关心您是否使用三个UIBezierPaths、一个UIBezierPath、多个路径、一个路径、子路径,还是甚至通过将其他绘图复制到此绘图中来完成——最重要的是最终效果,即在此图形上下文中累积绘制的内容。
你的问题就像问:“我应该用右手还是左手画这个圆,我应该逆时针还是顺时针画?”这并不重要。一旦完成,所绘制的内容就是一个圆;这才是重要的。

如果问题只是你不知道如何绘制,我的书会解释:http://www.apeth.com/iOSBook/ch15.html#_graphics_context_settings - matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接