官方文档链接(Core Graphics、View Controller、UICollectionView、UITableView、第三方库)

Core Graphics

Quartz 2D Programming Guide
Core Graphics (Framework)
Drawing(UIKit)Images and PDF(UIKit)

1、Quartz 2D使用的是绘图者模式进行成像。也就是,页面上的绘制,会被后面的绘制操作叠加覆盖,比如如果先画一个五角星线条,后画一个圆形,则圆形会覆盖五角星的部分线条比如中间的五边形但如果圆形不够大则不会覆盖五角星的五个角。注意,已经绘制的无法修改,只能被后绘制的覆盖。
2、graphics context封装了绘图参数、与输出设备相关的特征信息(比如bitmap graphics context表示输出成bitmap,比如PDF graphics context表示输出成PDF)。
3、Quartz会根据current graphics state的参数修改绘图操作的结果,参数比如颜色、线宽等。
4、current transformation matrix(CTM)是对坐标系统进行映射,然后再在新的坐标系统中进行绘图,意思应该是指,原本的坐标是(x,y,z),通过乘以CTM矩阵变成(x’,y’,z’),然后在绘图坐标系中的(x’,y’,z’)位置绘制这个点。
5、Quartz使用名字带有“Create”、“Copy”的函数创建对象时,会拥有这个对象,所以必须在使用完成之后释放。名字不带有这两个关键字则不需要手动释放,这些对象会在某个时间点自动释放。
6、所有的绘制都要绘制到graphics context,比如线宽、颜色、变换等。UIView的drawRect:被调用之前已经创建好graphics context,使用UIGraphicsGetCurrentContext获取。(当view在屏幕上可见时或者它的内容需要更新时,drawRect被调用。)
7、Anti-Aliasing会让文字很模糊,颜色变浅,但是会让图形的边缘平滑,可以设置CGContextSetShouldAntialias来打开或关闭Anti-Aliasing,并且需要CGContextSetAllowsAntialiasing也为true时才会执行Anti-Aliasing。
8、如果想逆转 变换CTM所产生的效果,一般不用CGAffineTransformInvert,而是用graphics state的存储和恢复,也许是因为每一次设置参数时都已经保存在graphics state中,存储和恢复只需要执行push和pop操作让state入栈出栈,而invert需要复杂的数学计算。
9、好像如果CGContextSetXX修改了graphics state(比如CGContextSetShadow),则接下来的绘制都使用所设置的状态,除非再次修改CGContextSetXX才会使接下来的绘制使用再次修改后的状态。
10、好像generic RGB color spaces在iOS无效,应该用DeviceRGB。
11、Quartz 2D Programming Guide有很多代码示例。
12、一直以为bitmap是指PNG,原来JPEG、TIFF、PNG都是bitmap image。
13、在某些情况下,生成副本的拷贝操作遵循“copy-on-write”语义,也就是只有当原始数据被修改时才会进行真正的物理拷贝,如果副本被销毁之前都没有修改原始数据,则副本和原始数据其实是同一块内存。
14、Core Graphics (Framework) 的CGContext有很多画图绘制接口和其他常用接口,CGPath有创建形状线条接口,然后绘制要用CGContext的接口。
15、是创建一个CGAffineTransform,还是直接使用CGContextScaleCTM,取决于这个transform要不要复用,如果复用则需要创建CGAffineTransform再concat到CTM,而不是直接修改CTM。同样,是创建一个CGPath还是直接使用CGContext的接口,取决于这个path是否需要复用。
16、一个bitmap image mask是决定一个颜色如何被传输(transfer),而不是决定使用哪种颜色。image mask中的每个样本值都指定当前填充颜色在特定位置被遮盖的量。
17、DrawingImages and PDF包含UIGraphicsxx相关函数。
18、CGPath
(1)调用完CGContextAddPath(ctx, path0);CGContextStrokePath(ctx);之后路径就清空了,所以接着调用CGContextFillPath(ctx);并不会填充路径,所以如果想要既描边又填充,需要在调用xxFillxx之前再调用一次添加路径,即CGContextAddPath(ctx, path0);CGContextFillPath(ctx);
(2)CGPathCreateCopyByDashingPath产生的dash_path,如果用CGContextFillPath绘制是无效的,既不会填充虚线本身,也不会填充虚线构成的形状(官方文档中Discussion的说明是什么意思呢?);用CGContextStrokePath绘制是有效,而如果还设置了CGContextSetLineDash,则这个设置的效果会叠加在dash_path之上而不是替换,也就是原本的dash_path的unpainted部分仍然不绘制,而原本的dash_path的painted部分如果处于CGContextSetLineDash所设置的unpainted部分则不绘制。
(3)CGPathCreateCopyByStrokingPath产生的新路径,如果用CGContextFillPath绘制,则效果等同于对原始路径使用CGContextStrokePath绘制;如果用CGContextStrokePath绘制,则发现会有两组平行的线段构成填充图形,而且内层的路径在拐角处会有交叉三角形,而且可以调用CGContextSetLineJoin、CGContextSetLineCap、CGContextSetLineDas对这些线段进行样式设置。总之就是,CGPathCreateCopyByStrokingPath会自动生成两个subpath组成一个填充区域为原本线段的stroke区域。
代码示例:(先描边再填充就可以遮盖拐角处的三角形。)

	CGContextSetLineWidth(ctx, 5);
	
	CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, 10
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值