iOS绘图和打印编程指导(一)-iOS绘图一览

参考苹果官文:Drawing and Printing Guide for iOS
本系列文章还包含下面一些文章:

涉及三部分内容:

  • 绘制自定义的UI视图.
    但使用常规的系统的UI元素无法满足需求时,就需要使用自定义的UI视图. 比如, 一个绘画APP可能需要使用自定义视图来进行作画, 一个街机游戏需要使用自定义视图来展示精灵.

  • 离屏绘制bitmap(位图)和PDF
    是否打算展示一张图片, 然后将该图片输出到file, 或者将其打印出来. 离屏绘制可以让你轻松实现这个功能.

  • 给你的APP添加AirPrint支持.
    iOS的打印系统可以让你将内容打印到不同的纸张.

图1-1, 你可以将自定义和标准的view结合使用, 也可离屏绘制内容

预览


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 typesUIWebView 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浏览器。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_x阅读 15,968评论 3 119
  • 时间:2017年11月8日22:15:38 星期三 Add Two Numbers Description You...
    badcyc阅读 198评论 0 0
  • 周末,像我这样的懒虫10点之前是完全不可能起床的。可是今天早上5点半却怎么都睡不着了,好奇怪,同时也是一种新鲜的感...
    杨天超阅读 150评论 0 0