iOS Auto Layout开发秘籍(第2版)

更多详情


内容简介: Auto Layout改变了创建iOS用户界面的方式。它既灵活又强大,给予你对iOS用户界面前所未有的控制,但AutoLayout的难度也是众人皆知的。在《iOS Auto Layout开发秘籍(第2版)》中,享誉世界的iOS开发者和图书作者Erica Sadun为你揭开了迷雾,帮助你通过“示例讲解”这种最简单的方法来精通Auto Layout。
针对iOS 7和Xcode 5的完全更新,本书秉承了该系列的优良传统:清晰的解释、专业的提示、可靠的最佳实践——以及,最重要的一点,大量可学习和复用的代码。
Sadun采用循序渐进的方式解释了Auto Layout的思想、它的工作原理、适用范围,以及比预想更有用(更简单)的原因。Sadun为现实世界的各种iOS开发挑战提供了实际的解决方案,使用Auto Layout创建可交互的元素、动画等。
主要内容
◆ 掌握Auto Layout的基本概念、技术和方法
◆ 定义无歧义的、可满足的约束,这种约束能准确表达你的布局意图
◆ 克服Interface Builder中基于约束的用户界面设计的障碍
◆ 使用视觉格式表示项是如何垂直和水平布局的
◆ 使用度量字典和布局选项使视觉格式更灵活
◆ 调试约束,解密那些令人费解的Xcode日志信息
◆ 使用描述性技术揭示和表达设计中的自然关系
◆ 在Mac OS X 应用中使用iOS AutoLayout技术

目录: 《iOS Auto Layout开发秘籍(第2版)》
第1章 Auto Layout介绍 1
1.1 Auto Layout的由来 1
1.2 使用Auto Layout的好处 2
1.2.1 几何关系 3
1.2.2 内容驱动的布局 5
1.2.3 优先级规则 5
1.2.4 检查和模块化 5
1.2.5 与Autosizing兼容 6
1.3 约束 6
1.3.1 可满足性 7
1.3.2 充分性 8
1.4 约束属性 10
1.5 关于那些丢失的视图 11
1.5.1 欠约束导致丢失视图 11
1.5.2 规则不一致导致丢失视图 12
1.5.3 追踪丢失的视图 13
1.6 有歧义的布局 13
1.6.1 纠正有歧义的布局 14
1.6.2 可视化约束 15
1.7 内在内容大小 16
1.8 压缩阻力和内容吸附 17
1.9 图像装饰元素 20
1.9.1 对齐矩形 20
1.9.2 可视化对齐矩形 20
1.9.3 对齐inset 21
1.9.4 声明对齐矩形 23
1.9.5 实现对齐矩形 24
1.10 练习 26
1.11 小结 27
第2章 约束 29
2.1 约束类型 29
2.2 优先级 31
2.2.1 冲突的优先级 31
2.2.2 枚举型优先级 32
2.3 内容大小约束 33
2.3.1 内在内容大小 33
2.3.2 内容吸附 34
2.3.3 压缩阻力 35
2.3.4 通过代码设置内容大小约束 36
2.3.5 在IB中设置内容大小约束 37
2.4 构建布局约束 38
2.5 布局约束类 39
2.5.1 约束数学 39
2.5.2 第一项和第二项 40
2.6 创建布局约束 41
2.6.1 构建NSLayoutConstraint实例 41
2.6.2 一元约束 42
2.6.3 不含视图项的约束是不合法的 43
2.7 视图项 43
2.8 约束、层次结构与边界系统 44
2.9 安装约束 46
2.10 比较约束 50
2.11 布局约束法则 52
2.12 练习 54
2.13 小结 55
第3章 Interface Builder布局 57
3.1 在IB中设计 57
3.2 禁用Auto Layout 58
3.2.1 在代码中退出Auto Layout 59
3.2.2 结合Autosizing和Auto Layout 60
3.3 基本布局以及自动生成的约束 60
3.3.1 推测的约束 61
3.3.2 歧义消除约束 62
3.3.3 尺寸约束 63
3.4 IB元素指南 64
3.4.1 约束列表 69
3.4.2 Xcode标签 70
3.4.3 添加Xcode标识 71
3.5 添加约束 72
3.5.1 拖曳 73
3.5.2 钉固和对齐 75
3.6 预览布局 76
3.7 检查约束 79
3.8 视图的Size Inspector 80
3.8.1 框架矩形和布局矩形 80
3.8.2 其他Size Inspector项 81
3.9 处理菜单 82
3.9.1 更新框架和约束 82
3.9.2 添加和重置约束 82
3.9.3 清理约束 82
3.10 约束/尺寸调整弹出菜单 83
3.10.1 Descendants选项 83
3.10.2 Siblings and Ancestors选项 84
3.11 视图丢失问题 84
3.12 平衡请求 86
3.13 混合布局 88
3.13.1 创建一个用于测试的nib文件 88
3.13.2 在代码中加入nib文件 89
3.13.3 混合布局的优点 91
3.14 移除IB生成的约束 92
3.15 练习 92
3.16 小结 95
第4章 可视化格式 97
4.1 可视化格式约束介绍 97
4.2 选项 99
4.2.1 对齐 100
4.2.2 省略选项 100
4.3 变量绑定 100
4.3.1 间接的问题 101
4.3.2 间接的替代方案 101
4.4 度量 102
4.5 格式字符串结构 103
4.6 方向 104
4.7 视图名称 104
4.8 连接 105
4.8.1 空连接 105
4.8.2 标准间隔 106
4.8.3 数字间隔 107
4.8.4 引用父视图 107
4.8.5 与父视图的间隔 107
4.8.6 灵活间隔 108
4.8.7 圆括号 109
4.8.8 负数 109
4.8.9 优先级 110
4.8.10 多视图 110
4.9 视图尺寸 111
4.10 格式字符串部件 113
4.11 出错 115
4.12 NSLog和可视化格式 115
4.13 约束到父视图 116
4.14 视图拉伸 117
4.15 约束尺寸 118
4.16 创建列或者行 119
4.17 匹配尺寸 120
4.18 为何不能分布视图 121
4.18.1 伪分布视图(第1部分:等中心) 121
4.18.2 伪分布视图(第2部分:间隔视图) 124
4.19 练习 126
4.20 小结 127
第5章 调试约束 129
5.1 Xcode反馈 129
5.1.1 开发反馈 129
5.1.2 编译器反馈 130
5.1.3 运行时 130
5.2 阅读控制台日志 131
5.2.1 示例:自动尺寸调整问题 131
5.2.2 解决方案:关闭自动尺寸调整转换 132
5.2.3 示例:Auto Layout冲突 133
5.2.4 解决方案:调整优先级 134
5.2.5 原子法 134
5.2.6 平衡法 134
5.2.7 追踪歧义 135
5.3 检查约束日志 135
5.3.1 示例:对齐约束 136
5.3.2 示例:标准间隔 136
5.3.3 示例:基于等式的约束 136
5.3.4 示例:复杂等式 137
5.3.5 示例:乘数和常数 138
5.4 布局数学中的一个注意点 138
5.5 约束等式字符串 139
5.6 添加名称 142
5.6.1 使用名称标签 142
5.6.2 命名视图 143
5.7 描述视图 144
5.8 示例:意外的填充 146
5.9 示例:图像吸附 147
5.10 示例:视图居中 148
5.11 向下遍历报告 151
5.12 示例:歧义 152
5.13 示例:控制台输出的扩展 153
5.14 可视化约束 155
5.15 启动参数 156
5.16 国际化 158
5.16.1 加倍的字符串(iOS/OS X) 158
5.16.2 翻转界面(OS X) 159
5.16.3 翻转界面(iOS) 160
5.17 概要分析Cocoa布局 162
5.18 调试中的Auto Layout规则 163
5.19 练习 163
5.20 小结 164
第6章 使用Auto Layout创建 165
6.1 Auto Layout的基本原则 165
6.2 布局库 166
6.3 界面设计 170
6.4 模块化创建 171
6.5 更新约束 173
6.5.1 调用更新并以动画形式显示变化 174
6.5.2 以动画形式显示OS X上的约束变化 175
6.5.3 渐褪变化 175
6.6 边缘条件设计 176
6.7 创建一个视图抽屉 179
6.7.1 创建抽屉布局 181
6.7.2 管理被拖曳视图的布局 184
6.7.3 被拖曳的视图 184
6.8 窗口边界 186
6.9 练习 188
6.10 小结 188
第7章 布局解决方案 191
7.1 表单元格 191
7.2 保存图像纵横比 195
7.3 等宽尺寸 197
7.4 滚动视图 198
7.4.1 滚动视图和纯Auto Layout 199
7.4.2 混合解决方案 199
7.4.3 创建一个分页式图片滚动视图 200
7.5 居中视图组 203
7.6 自定义乘数和随机位置 204
7.7 创建栅格 207
7.8 为键盘留出空间 209
7.9 在运行时插入视图 211
7.10 运动效果、动态文本和容器 213
7.11 练习 214
7.12 小结 214
附录A 练习参考答案 215

译者序: iOS已陪伴我们走过了7年,搭载着iOS系统的设备,例如iPhone、iPod touch、iPad,以其丰富的功能和出色的用户体验,改变了人们日常的生活、工作和娱乐方式。iOS 7的发布,表明iOS进入了新的纪元,它呈现给用户一个扁平、简约而又明朗的界面。
如同一对初次邂逅的男女,往往第一眼便决定了是否会一见钟情。推而广之,开发者往往会花费大量时间去雕琢出一张充满魅力的“脸”,让它无论在浅浅微笑时,还是在扮鬼脸时都富有吸引力。但这确实不是一件容易的事情。在iOS界面方面,Apple做了许多卓有成效的努力。无论是从OS X平台引入了Autosizing技术,还是到iOS 6的时候,引入了自动布局(Auto Layout)技术。自动布局可以实现早前布局技术所无法实现的布局要求。
但是相对而言,自动布局还是一种较新的技术,目前市面上的书籍,也没有对该部分内容进行比较细致的讲解,让一些初次接触自动布局的开发者感觉无从下手。《iOS Auto Layout开发秘籍(第2版)》可以说是弥补了这个空白,难能可贵的是,这本书不仅涵盖了iOS和OS X平台,而且几乎深入阐述了自动布局技术的方方面面,既有深度又有广度。
该译本出版的时候,可能iOS 8已经发布正式版。在iOS 8中,自动布局也会有显著的改变。不过,本书仍是学习自动布局的不二选择。一方面,因为它是比较基础而又系统的,可以帮助读者掌握自动布局的一些基本原理和实现;另一方面,了解一种技术最初的形态,可以帮助改善应用的兼容性。最后,诚如作者所言,“我的意图是使你在放下这本书之后,便能拥有Auto Layout方面的坚实基础”。
本书由孟立标翻译,参与翻译活动的还有孔祥亮、陈跃华、杜思明、熊晓磊、曹汉鸣、陶晓云、王通、方峻、李小凤、曹晓松。限于时间、精力以及本人的专业水平能力,书中难免会有疏漏错误之处,敬请读者批评指正。
译 者

前言: Auto Layout重新构思了开发者创建界面的方式。它创建了一个灵活、强大的系统,来描述视图和它们的内容是如何相互关联的,它们和它们占据的窗口和父视图是如何关联的。与旧的设计方法相比,这种技术为布局提供了难以置信的控制,比frame、spring、strut所允许的范围更广阔。也有被一些激怒的开发者中伤的,使得Auto Layout获得了难以使用、令人沮丧的名声,特别是通过Interface Builder(IB)使用时。
这就是本书存在的原因。你将通过一些包含大量解释和提示的示例来揭示Auto Layout的优势。本书并不过多介绍类文档,而是通过简单的步骤来学习该系统的工作原理,以及它为什么比你初次所想的更强大。你将看到一些常见的设计场景,并发现使用Auto Layout是一种乐趣,是最佳实践,而不是一项累人的工作。
你也会探索很多Auto Layout的优点。它是一项非常有用的技术:
Auto Layout是声明性的。表达界面时不必担心这些规则是如何实现的。只要描述这个布局即可,可以让Auto Layout计算frame。
Auto Layout是描述性的和相关性的。你需要描述项在屏幕上是如何相互关联的。可以忘掉尺寸和位置。重要的只是关系。
Auto Layout是集中的。无论在IB还是在你自己代码里的布局区域,Auto Layout规则倾向于迁移到一个简单的关系,使它更易于检查和调试。
Auto Layout是动态的。你的界面会在需要响应用户和源自应用的改变时而更新。
Auto Layout是可本地化的。使用Auto Layout可以征服世界。它在维护界面完整性时,适应不同的单词和词组长度。
Auto Layout是表达性的。你可以描述比能在旧的spring-strut系统中更多的关系。不只是“吸附这条边”或者“沿着这个坐标轴改变尺寸大小”,它可以表示一个视图关联到另一个视图的方式,而不仅仅是它的父视图。
Auto Layout是增量式的。可以根据你自己的时间表使用它。可以添加它,将它作为应用和界面的一部分,或者将其作为一个完整的Auto Layout经历。Auto Layout提供向后兼容,使你可以使用所有spring和strut、所有约束或者两者的混合,来创建自己的界面。
本书旨在为你提供灵感。我试着去演示使用Auto Layout来创建可交互元素、动画和其他超越你可能在IB中遇到的特性的示例。这些章节为Auto Layout工作提供了一个启动平板,引入了一些可以拓展设计可能性的不常见特性。
正如书名所提示的,本书基本的目标读者是iOS开发者。我在可能覆盖的地方引入了OS X。因此,如果你是一个OS X开发者,不会被冷落。本书的内容主要还是针对iOS。当你阅读时请记住这一点。
Auto Layout已经对我的日常开发产生了深远的影响。我撰写本书,希望Auto Layout也能对你的开发工作带来深远影响。我的意图是使你在放下这本书之后,便能拥有Auto Layout方面的坚实基础。如果我幸运的话,这本书会给你“我找到了!”的惊喜一刻,本书将引导你前进。
——Erica Sadun
这本书的内容安排
这本书提供了实际的Auto Layout教程。以下是本书内容介绍。
第1章,“Auto Layout介绍”——准备好了吗?本章解释Auto Layout背后的基本概念。你将学习为什么应当在应用里使用Auto Layout,以及为什么它必须是一个满足约束的系统。
第2章,“约束”——在Auto Layout中,通过声明关于视图的规则来创建界面。你添加的每个布局规则创建一个关于界面的某部分如何布局的要求。这些规则根据你提供给系统的一个数值优先级来排定等级,相应地,Auto Layout创建你的界面的可视化表现。本章介绍约束以及布局规则,并且解释了为什么你的规则必须是无歧义的、可满足的。
第3章,“Interface Builder布局”——在Interface Builder中使用基于约束的设计有时对于Auto Layout开发新手来说,可能是一个令人沮丧的经历。iOS 7和Xcode 5完全更新后,本章教你一些你需要的窍门,使IB精确地创建你想要的界面。
第4章,“可视化格式”——本章探索可视化约束看起来如何,你如何创建它们,以及如何在项目中使用它们。你将学到度量字典和约束选项是如何拓展可视化格式来获取更多的灵活性。本章介绍了大量示例,用于演示这些格式以及探索它们产生的结果。
第5章,“调试约束”——约束有时比较晦涩。你创建约束时使用的代码和界面文件并不易于细读。它只提供一些“有用的”Xcode日志消息,这让一些开发者十分纠结。本章专注并聚焦于底层约束并帮助调试你的工作。
第6章,“使用Auto Layout创建”——对Auto Layout的设计改变了你创建界面的方式。它是一个描述性的系统,远离了准确的度量,例如frame和center,差别比较大。你将注意力放在视图间的关系上,它描述了屏幕上的某项是如何跟随另一项的。通过基于约束的规则,在设计中揭示了这种自然关系,并详细描述了它们。本章介绍Auto Layout设计的表达,聚焦于它的基本原则,并提供了一些展示其特性的示例。
第7章,“布局解决方案”——本书前面章节关注于基础知识和原理。本章介绍解决方案。你已经学习了各种现实世界的挑战,以及Auto Layout是如何为日常开发工作提供切实可行的答案。这些主题就像一个摸彩袋,展示开发者通常会提出的请求。
附录A,“练习参考答案”——该附录提供了所有章节后的练习题的答案。
关于示例代码
本书沿用了iOS Developer’s Cookbook系列的风格。书中的iOS示例代码总是以单个main.m文件开始,你会在其中发现支撑该示例的应用的核心部分。人们一般在开发iOS或者Cocoa应用时不采用这种方式,但是它提供了一种展现单一想法的绝佳方式。当读者需要在许多文件中搜寻,并试图找出哪些文件是相关的,哪些是无关的时候,要讲清楚这一过程就很难了。提供单个启动点浓缩了这个过程,使得在单个代码块中便能获悉整个想法。
本书所提供的代码并非遵循标准的日常最佳实践方式。书中提供了精确的解决方案,你可以根据需要将它们纳入到你的工作中。书中的示例大都使用一个应用标识:com. sadun.helloworld。这使你的iOS设备避免同时被许多示例阻塞。每个示例替换前面一个,确保你的主屏幕保持相对整洁。如果想要同时安装若干示例程序,只需要编辑标识,添加一个独一无二的前缀即可,例如com.sadun.helloworld.table-edits。
你也可以编辑自定义的显示名称,使应用在视觉上看起来截然不同。你的iOS Team Provisioning Profile匹配任何应用标识,包括com.sadun.helloworld。这允许将编译后的代码安装到设备上,而无须更改该标识,只需要确保在每个项目的构建设置(build settings)中更新你的签名标识(signing identifier)。
本书中还有一些浅显易懂的OS X代码。这不是一本以OS X为中心的书籍(你可以从书名中猜到这一点),但是在必要的地方,覆盖到了OS X主题。本书的篇幅主要花费在iOS上,因此请原谅任何在OS X方面的失误,请务必写邮件帮助纠正任何错误。
获得示例代码
你可以在开放源码托管站点GitHub上的http://github.com/erica/Auto-Layout-Demystified页面上,找到本书的示例代码。其中可以找到按章节划分的源码,这些源码提供了本书涉及的示例文件。
正如后面解释的,你可以通过直接使用git或者单击GitHub的下载按钮来获取示例代码。在我撰写本书时,它位于页面的右边。它使你能够以一个zip或者tarball(.tar)压缩文件的形式获取整个代码库。
获取Git
可以通过使用git版本控制系统来下载本书的源码。git的一个OS X实现可以通过http://code.google.com/p/git-osx-installer获取。OS X git实现包括了命令行和GUI解决方案,这样,你可以去寻找一个最适合自己开发需求的版本。
获取Github
Github(http://github.com)是最大的git托管的站点,拥有超过150 000个公共代码库。它既为公有项目提供了免费的托管,也为私有项目提供了付费选项。Github拥有一个定制的Web界面,包括了wiki托管、问题跟踪以及对项目开发者社交网络的强调,使得它成为找寻新代码或者在现有库上展开合作的绝佳地方。可以在Github网站上注册一个免费账户,这使得你可以复制并修改这个代码库,或者创建自己的iOS开发源码项目与他人分享。
贡献!
示例代码永远不会是最终版本。它会随着Apple更新它的SDK和Cocoa Touch库而持续演进。加入我们吧!你可以通过建议需要修复的bug、提出修复bug的方式以及扩展提供的代码参与进来。Github允许你创建代码库的分支,使用你自己的微调和特性来扩展它们,然后将它们分享回主代码库。如果你提出一个新的想法或者方法,请告诉我。我的团队和我非常乐于将好的建议纳入到代码库和本书的下一个版本中。
联系作者
如果你有关于本书的任何评论或者疑问,请给我发送邮件(erica@ericasadun.com)或者访问Github库并联系我。
编者按:我们想要听到你的声音!
作为本书的读者,你是我们最重要的评论家和评论员。我们非常重视你的观点,并希望知道什么是我们做得好的,什么是我们可以做得更好的,什么领域的书籍是你希望我们出版的,以及任何其他你愿意传达给我们的想法。
你可以发送Email或者直接给我写信让我知道你喜欢还是不喜欢本书——以及我们该做些什么来使我们的书更具价值。
但请注意,我无法给予你任何与本书主题相关的技术问题的帮助,由于我收到的邮件数量较多,因此可能无法回复每一封邮件。
当你来信时,请确保包含本书的书名、作者以及你的名字和电话号码或者邮件地址。我会仔细地阅读你的评论,并将它分享给本书的作者和编辑人员。
E-mail: trina.macdonald@pearson.com
Mail: Trina MacDonald
Senior Acquisitions Editor
Addison-Wesley/Pearson Education, Inc. 75 Arlington St., Ste. 300
Boston, MA 02116