CGContext与CALayer

我试图在Quartz 2D上find一个句柄,并在Mac OS X开发人员的在线书籍石英二维graphics 。

一个非常基本的东西,让我困惑的是CGContext。 例如,我可以用下面的代码绘制一个简单的“U”形状,并在CAShapeLayer使用它,而无需引用CGContextCAShapeLayer默认情况下是否隐含/提供了上下文?

我可能在这里混合了几个iOS / OSXgraphicsAPI,所以也许有人可以澄清我的错在哪里。

 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]; 

是的,CAShapeLayer会为您绘制path。

请注意,使用CAShapeLayer时,您使用CG path ,而如果您自己正在绘制上下文,则可能需要使用CG 上下文自己的path绘制函数。

最大的区别在于,CGContextpath函数直接将命令添加到上下文的当前path中,当您告诉上下文来填充或描画(或显式放弃)path时将被抛弃,而CGPath对象将它们保留以便再次被重用并再次 – 例如,如果您更改CAShapeLayer的图纸属性。

当然,即使要将其绘制到上下文中,也有使用CGPath的情况。 如果这组命令从不改变,那么这是一个潜在的优化; 它使path变得容易; 之后你可以遍历它的命令(例如,将它们导出到一个文件)。 您也可以使用UIBezierPath(即使用Objective-C消息)编写绘图代码,然后向其请求CGPath。

以任何一种方式使用CGContext都没有错,可能有些情况是最好的,但是对于大多数目的而言,CAShapeLayer是最简单的方法,特别是在Cocoa Touch中,每个UIView都有一个CALayer支持,可以将CAShapeLayer放入。