首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CGContext vs CALayer

CGContext vs CALayer
EN

Stack Overflow用户
提问于 2013-02-02 12:55:21
回答 1查看 2.6K关注 0票数 5

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

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

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

代码语言:javascript
复制
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];
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-03 08:03:18

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

请注意,在CAShapeLayer中,您使用CGPath,而如果您自己绘制上下文,则可能需要使用CGContext自己的路径绘制函数。

最大的区别是CAShapeLayer函数直接将命令添加到上下文的当前路径中,当您告诉上下文填充或描边(或显式放弃)路径时,这些命令将被丢弃,而CGPath对象会保留这些命令,以便一次又一次地重用-例如,如果您更改CGContext的绘图属性。

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14658750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档