CGContext上VS的CALayer(CGContext vs CALayer)

2019-07-19 04:16发布

我试图让石英2D手柄和看在线图书石英2D图形的Mac OS X开发 。

这是混淆了我一个非常基本的东西是CGContext上。 例如,我可以得出用下面的代码一个简单的“U”形,并在使用它CAShapeLayer而不引用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];

Answer 1:

是的,CAShapeLayer将绘制路径到你的环境。

请注意,CAShapeLayer,您使用CG 路径 ,而如果你正在绘制到上下文自己,你可能需要使用CG 背景下自己的路径绘制函数来代替。

最大的区别是,CGContext上路径功能添加命令直接进入上下文的当前路径,被扔掉,当你告诉的背景下,以填补或中风(或明确放弃)的路径,而CGPath对象保持周围被再次重用并再次 - 例如,如果你改变了CAShapeLayer的绘图性能。

当然,也有使用CGPath甚至当你打算把它拖到到上下文的情况。 如果命令集永远不会改变,那么它是一个潜在的优化; 它使容易转化的路径; 你可以遍历其命令(例如,将其导出到文件)之后。 你也可以写与UIBezierPath绘图代码(即,使用Objective-C的消息),然后问它的CGPath。

在任一方式使用CGContext上是没有错的,并且有可能是在它是最好的情况,但CAShapeLayer是对于大多数的目的最简单的方法,特别是在可可触摸,其中每UIView的是,你可以把CAShapeLayer到CALayer的支持。



文章来源: CGContext vs CALayer