本文接上文。链接奉上~
11.上下文坐标系Context Coordinate System
在UIKit中采用的是左上原点坐标系,在Quartz采用的是左下原点坐标系。
原点在哪里取决于你用的是什么创建上下文。如果你用的是UIKit方法,原点在左上。如果你用的是CGBitmapContextCreate(),原点在左下。
✨🌟不过说实话CG建上下文的方法那么麻烦 谁没事用哪个建立上下文啊。。。所以代码没仔细看,,不过还是贴出来了。。
当然你也可以调整Core Graphics上下文使用UIKit的原点。具体代码如下
12.剪辑Clipping
剪辑的意思是在你的上下文里所有绘图操作都只能在限定的区域里进行。为了进行剪辑,先要向上下文中添加限制的区域的路径,然后调用CGContextClip()方法。
具体步骤如下:
1.保存图像的状态。这可以让你重现剪裁前的版本,如果你不需要返回可以跳过这一步。
2.向上下中添加一个路径,然后调用CGContextClip方法。
3.开始绘图,路径外的操作会被自动丢弃掉。
4.返回1中保存的状态。
大概可以剪出像这样的图,还是很洋气吧
13.调整 Transforms
我们再来看看如图所示的效果
要怎么实现这样的效果呢,我们只需要借助于UIKit里面NSString自己的在上下文中绘图的方法DrawAtPoint:withAttributes:方法就足够了。具体代码如下~
当然我们之前提到的上下文状态的时候,也有提到一种调整状态(感激翻译的不到位啊,原文是transform state)可以控制绘图是的旋转缩放和位移。当然,我们只需要做一个小小的调整,上面那个例子就立马可以变成下图这样婶的,立马又高端了一点。
具体代码如下
还有另一种方法同样可以实现上述效果,对比一下 看看有什么区别吧~
14.线的参数设置 Setting Line Parameters
可以通过CGContextSetLIneWidth来改变上下文中线的宽度。当然,如果你用的是UIBezierPath,只用用path的lineWidth属性来改变线的参数。
下面这个例子,分别用4像素的bezierpath绘图和20像素的上下文绘图。
得出的效果如下
然后我们看看想用线绘出一堆线段(Dashes)要怎么完成吧~
这里只需要一个方法就可以了。
在bezieropath里面是这样的。
用图形上是这样的。
出来的效果都是下面这样的
总结
·对于许多绘图需求来说,有很多解决方法都可以达到相同的目的。至于是选择Core Graphics的方法还是UIKit的方法,只会影响到你是选择那一个API,这里没有固定的答案,哪个你用起来表顺手就用那个吧~
·UIKit在不断的改进。随着iOS版本的更迭,苹果提供了悦来越多的资源来让你直接跳过使用Quartz里的方法。UIKit API提供了更为简洁的方法。大部分开发者会发现UIKit的优点更多的主要使用UIKit提供的方法来绘图。当然,苹果也是建议开发者使用最高级的API来编程,用低等级的API往往是在高级API中找不到对应方法等时候,比如绘图时计算阴影或者输出颜色空间(color spaces)时。
·要熟悉核心库的C语言风格,以及手动内存管理的机制。了解Ref机制。有个规律如下:见到Copy和Create就要release。如果时Get,不需要。前缀create也要前缀release。比如,create a color space,就要用CGColorSpaceRelease()来释放他~
·Quartz和UIKit都是线程安全的。