CodeV

1.2-什么时候需要绘图

对于开发人员来说,iOS绘图虽然是一个相当普遍的任务,但是任务本身并不一般。 大多数绘图仅限于某些特定的场合,即四个非常常见的直接使用图形的场景:创建自定义视图,构建图像,创建PDF以及使用Core Graphics构建绘图。

创建自定义视图

每个UIKit视图本质上是一个空白的画布。你可以通过在应用程序中绘制最能表达视图角色的内容来完全自定义视图。 你可以通过在一个叫drawRect:的特殊方法中绘制内容来实现。 此方法使您能够通过调用UIKit和Quartz绘图程序来自定义视图的外观。

图 1-1 显示了一个自定义颜色控件。它由一组样本视图组成,其中每个视图都是一个实现了drawRect:方法的UIView的子类。这些视图绘制了圆角边框,信息文本和颜色的飞溅,以创建一个完全实现的,但完全自定义的外观。

图 1-1

图 1-1 这些颜色卡片是通过自定义drawRect:方法来实现的

除非你在一个子类中重写它,默认的drawRect:方法基本上什么也不做。使用UIKit和Core Graphics程序创建演示内容的子类重写此方法。它们将绘图请求添加到它们的子类实现。 仅仅更新背景颜色或以其他方式提供内容的简单视图不应该重写drawRect:方法。 类似地,使用OpenGL ES的视图也不应使用此入口点进行绘制。

drawRect:方法有一个只用于类似的方法:drawRect:forViewPrintFormatter:允许您自定义内容去实现打印和显示呈现不同效果。

构建图像

并不是每个图像都以PNG或JPEG文件的形式出现。在iOS上,你可以绘制在一个UIKit图像上下文中并检索生成一个UIImage实例。这使您能够创建新图像或修改现有图像。

图 1-2 显示了一个以用程序构造的彩色圆盘。 此图像是通过绘制到UIKit图像上下文中的一系列彩色贝塞尔扇弧路径创建的。然后将所得图像添加到标准图像视图。绘图使您能根据需要构建自定义图像,而不必依赖于预先存在的图像文件库。

使用代码来绘图是一个重要的权衡。 虽然相对来说你需要更多的处理时间来创建图像(不是一个巨大的数,而且是可衡量的),你最终会得到一个体积更小的应用程序包,所需要的资源也会更少。改变图像只需要修改创建它们的代码,所以您的图像也更灵活。

图1-2

图 1-2 彩色圆盘是通过代码生成的一个自定义的UIImage实例

创建PDF文件

帮助您构建图像的相同类型的调用也支持构建PDF。您可以绘制到UIKit PDF上下文中,该上下文可以直接发送到文件或保存到数据。这使您能够从应用程序构建PDF内容,然后共享,存储或显示它们,如图 1-3 所示。

PDF提供了一种高度可移植,不依赖系统的标准,其封装了一个完整的文档描述。您在iOS上创建的文档能在用于查看该文档的任何计算机上看起来都一样,只不过有时操作系统的颜色管理系统或多或少可能会影响颜色显示。

图1-3

图 1-3 包含多页面的PDF在此iOS 6 popover中的预览。

使用Core Graphics构建

当你想打破UIKit的当前功能的局限性,你可以回到标准的Quartz。Core Graphics已经存在很长时间了,它的绘图功能已经为OS X提供了至少十年的支持。任何不能立即在UIKit中调整的功能几乎都可以通过Quartz实现。

将项目绘制到Core Graphics上下文中提供了灵活而强大的绘图解决方案 - 即使它们不像UIKit一样简单。Core Graphics使用Core Foundation风格的基于C的对象,并需要手动保留和释放开发策略。

例如,您可能希望逐个字节访问图像数据。这是一个UIKit尚未处理的很好的任务,但是使用Core Graphics的位图上下文是可以完美解决的。图 1-4 显示了为什么你可能要转而使用Quartz函数的示例。在本示例中,使用Core Graphics将左侧的RGB图像渲染为右侧的灰度颜色空间。

生成的图像必须从Quartz CGImageRef(以Ref结束的CG类型是指向对象的指针)转换为UIImage实例(imageWithCGImage :)并显示在标准的图像视图中。

图1-4

图 1-4 将这个RGB图像转换为灰度表示的例子是使用原生Core Graphic编写的。


本文翻译自《iOS Drawing Practical UIKit Solutions》作者:Erica Sadun,翻译:Cheng Dong。如果觉得本书不错请购买支持正版:亚马逊购买传送门,本书所有源代码可在GitHub上下载。译者虽然力求做到信,达,雅,但是由于时间仓促加之译者水平十分有限,文中难免会出现不正确,不准确,词不达意,难于理解的地方,还望各位批评指正,共同进步,谢谢。转载请注明出处。