5

我正在尝试了解 Quartz 2D 并查看在线书籍Quartz 2D Graphics for Mac OS X Developers

让我感到困惑的一件非常基本的事情是 CGContext。例如,我可以使用下面的代码绘制一个简单的“U”形,并在 a 中使用它CAShapeLayer而不引用 a CGContext。默认情况下是否隐含/提供上下文CAShapeLayer

我可能在这里混合了几个 iOS/OSX 图形 API,所以也许有人可以澄清我哪里出错了。

CGPoint pt1 =  CGPointMake(100, 100);
CGPoint pt2 =  CGPointMake(150, 100);
CGPoint pt3 =  CGPointMake(150, 200);
CGPoint pt4 =  CGPointMake(190, 200);
CGPoint pt5 =  CGPointMake(190, 100);
CGPoint pt6 =  CGPointMake(210, 100);
CGPoint pt7 =  CGPointMake(210, 250);
CGPoint pt8 =  CGPointMake(100, 250);
CGPoint pt9 =  CGPointMake(100, 100);

CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, nil, pt1.x,pt1.y);
CGPathAddLineToPoint(path, nil, pt2.x, pt2.y);
CGPathAddLineToPoint(path, nil, pt3.x, pt3.y);
CGPathAddLineToPoint(path, nil, pt4.x, pt4.y);
CGPathAddLineToPoint(path, nil, pt5.x, pt5.y);
CGPathAddLineToPoint(path, nil, pt6.x, pt6.y);
CGPathAddLineToPoint(path, nil, pt7.x, pt7.y);
CGPathAddLineToPoint(path, nil, pt8.x, pt8.y);
CGPathAddLineToPoint(path, nil, pt9.x, pt9.y);

CAShapeLayer *shapeLayer = [CAShapeLayer layer];
[self.view.layer addSublayer:shapeLayer];
4

1 回答 1

5

是的,CAShapeLayer 会为您将路径绘制到上下文中。

请注意,使用 CAShapeLayer,您使用 CG Path,而如果您自己绘制到上下文中,您可能希望使用 CG Context自己的路径绘制函数。

最大的区别是 CGContext 路径函数将命令直接添加到上下文的当前路径中,当您告诉上下文填充或描边(或明确放弃)路径时将其丢弃,而 CGPath 对象将它们保留在周围以再次重用再一次——例如,如果您更改 CAShapeLayer 的绘图属性。

当然,即使您要将其绘制到上下文中,也有使用 CGPath 的情况。如果命令集永远不会改变,那么这是一个潜在的优化;它使转换路径变得容易;之后,您可以迭代其命令(例如,将它们导出到文件)。您还可以使用 UIBezierPath(即,使用 Objective-C 消息)编写绘图代码,然后向它询问 CGPath。

以任何一种方式使用 CGContext 都没有错,并且可能在某些情况下它是最好的,但 CAShapeLayer 是大多数用途的最简单方法,特别是在 Cocoa Touch 中,其中每个 UIView 都由您可以将 CAShapeLayer 放入的 CALayer 支持.

于 2013-02-03T00:03:17.920 回答