参考苹果官文:Drawing and Printing Guide for iOS
本系列文章还包含下面一些文章:
- iOS绘图和打印编程指导(二)-关于iOS绘图的一些概念
- iOS绘图和打印编程指导(三)-使用UIBezierPath来绘制图形
- iOS绘图和打印编程指导(四)-绘制和创建图片
- iOS绘图和打印编程指导(五)-生成PDF内容
- iOS绘图和打印编程指导(六)-iOS打印
- iOS绘图和打印编程指导(七)-补充
涉及三部分内容:
绘制自定义的UI视图.
但使用常规的系统的UI元素无法满足需求时,就需要使用自定义的UI视图. 比如, 一个绘画APP可能需要使用自定义视图来进行作画, 一个街机游戏需要使用自定义视图来展示精灵.离屏绘制bitmap(位图)和PDF
是否打算展示一张图片, 然后将该图片输出到file, 或者将其打印出来. 离屏绘制可以让你轻松实现这个功能.给你的APP添加AirPrint支持.
iOS的打印系统可以让你将内容打印到不同的纸张.
预览
iOS原生绘图系统包含三种主要技术:UIKit, Core Graphic, 和Core Animation.
UIKit提供了view和为这些view提供了上层绘画功能.
Core Graphic为UIKit中的view提供的是底层的绘图技术.
Core Animation使得view具有变换(transformations)和动画的能力. 另外view合成也是由Core Animation负责的.
自定义UI视图在绘制时具有跟高的灵活性
本系列文档教你如何使用原生的绘画技术在自定义UI视图绘制内容, 这些技术包括Core Graphic和UIKit框架, 它们支持2D绘制.
因为使用原生绘制技术绘制是比较耗性能的, 所以在考虑使用自定义的UI视图前想想能不能使用标准的UI视图代替, 原生绘制适合更加复杂的2D布局, 简单但的UI需求建议使用标准的view.
作为自定义绘图的替代, iOS应用可以使用以下几种方式在屏幕上绘制内容:
- 使用标准(内置)的view 使用系统自带的标准view, 你可以绘制一些基础常用的用户界面, 比如列表, collection, 警告框, image, 进度条, tableView等, 这些UI元素, 都是不需要程序写绘制代码的. 使用的系统内置view可以省时省力, 还可以保证所有界面风格一致. 关于如何使用系统内置的view你可以阅读iOS View 编程指导系列文章
- 使用Core Animation Layers Core Animation可以让你创建复杂, 2D的, 可变换的, 可动画的视图. 使用Core Animation技术来标准的视图做动画, 或者合成一些复杂的view来展示立体效果.
- 使用OpenGL ES来绘制GLKit视图和自定义视图 OpenGL ES框架提供了依靠开放式标准图像库, 主要面向游戏开发或者需要高帧率的应用, 比如虚拟样机APP, 和机械, 建筑设计相关的APP. 它符合OpenGL ES 2和OpenGL ES V1.1规范, 想要了解更多关于OpenGL的绘图知识, 请看OpenGL ES Programming Guide
-
使用web内容
UIWebView
类让你展示基于网页的用户界面, 想了解如何使用webView来展示网页的知识, 请看Using UIWebView to display select document types和UIWebView Class Reference
有的应用中只会使用少量的自定义绘图甚至不会遇到要自己写绘图代码的情况, 这取决于你APP的类型. 虽然沉浸式APP通常广泛使用自定义绘图代码, 但是工具类和提高效率类APP通常都是使用iOS自带的标准view和控件来构造界面.
在使用自定义view时, 需要考虑屏幕内容频繁变动的情况. 比如, 一个画图APP通常使用自定义绘图代码来记录用户的绘图命令; 在街机类游戏中, 你可能需要经常更新屏幕来展现游戏环境在不断的变化. 在这些情况下, 你应该选择合适的绘图技术创建自定义view来处理event和更新内容.
另一方面, 如果你的APP中有大量的静态界面, 你可以预先将界面渲染成一张或多张图片, 在runtime时使用UIImageView
类将这些图片显示. 你还可以堆放imageView已经其他所需的内容来构造用户界面. 你可以使用UILabel
来显示文字, 使用button等控件来提供可交换性. 像棋盘类电子游戏很少/没有用到自定义绘制.
考虑到自定义绘图需要消耗处理, 如果能够使用标准的view, 那么就选择标准的view; 而且在使用绘图时, 尽量确保绘图视图越小越好, 只绘制你需要的且无法使用其他view代替的内容即可. 如果你需要将自定义view和标准view结合使用, 那么推荐使用Core Animation中的layer来将自定义view和标准view叠加起来, 以便减少绘制.
使用原生技术绘图的几个关键概念
当你使用UIKit和Core Graphic绘制内容时, 你除需要知道绘图周期外还应该知道几个关键概念.
- 对于
drawRect:
方法, UIKit创建一个graphic context(绘图上下文)来将内容渲染到屏幕. 这个绘图上下文提供执行绘图命令所需要信息, 这些信息包括stroke color, font, clipping area, line width等, 它就是一个绘图环境. 您还可以创建和绘制自定义图形上下文的位图图像和PDF内容。 - UIKit有一个默认的坐标系, 该坐标系的远点在屏幕的左上方; x轴正向是从原点往右的方向, y轴正向是从原点往下的方向. 你可以通过修改当前transformation矩阵来改变相对于底层view或window中的默认坐标系下的大小, 方法, 位置. 该变换矩阵将试图将坐标空间映射到设备屏幕.
- 在iOS系统中, 逻辑坐标空间是使用点来度量的, 和真实的设备屏幕尺寸(单位是像素)不等, 其中有个转换关系. 为了精确度更高, 点使用浮点数表示.
参考demo
- PrintPhoto:展示如何使用photo框架和print API的使用
-
Sample Print Page Renderer:此示例演示如何使用
UIPrintPageRenderer
子类对打印的页进行完全控制。除了绘制全页自定义内容、自定义页眉和页脚之外,它还显示了如何使用UIPrintFormatters
执行一些繁重的工作。 -
UIKit Printing with UIPrintInteractionController and UIViewPrintFormatter:该demo演示如何使用
UIViewPrintFormatter
类打印由UIWebVIEW对象显示的内容。此示例应用程序是具有打印能力的原始Web浏览器。