一.自动布局(Auto Layout)-开始-理解自动布局

自动布局会根据在你的视图(view)层级中所有视图的约束(constraints),动态的计算视图的尺寸与位置.例如,你可以为一个按钮(button)设置约束,使其相对于一个图片视图(Image view)水平居中,然后,此按钮的上部边缘一直与图片的下部边缘保持8点(points)的距离.如果图片视图的尺寸或位置改变了,按钮的位置会相对自动调整.

此种基于约束(constraint-based)的设计方法允许你创建一个可以同时响应内部与外部变化用户界面.

1.外部改变

外部改变发生于你的上级视图的尺寸与形状发生改变的时候.每次改变发生的时候,你必须更新你的视图层级来充分使用可用的空间.以下为通常会引起外部改变的因素:

· 用户改变窗口尺寸(OS X).
· 用户进入或退出iPad上的分屏视图(Split View)(iOS).
· 设备旋转(iOS).
· 通话条和录音条的出现消失(iOS).
· 你想要支持不同的尺寸类(size classes).
· 你想要支持不同的屏幕尺寸.

这些改变大部分是在运行(runtime)的时候发生的,并且需要来自你的应用(app)的动态响应.其他的改变,例如支持不同的屏幕尺寸,相当于应用适应不同的环境.即使应用在运行的时候一直不会改变屏幕尺寸,也要创建一个可以让你的应用可以同时运行在iPhone 4S,iPhone6 Plus,或者甚至iPad上的界面.自动布局同样是一个为iPad的Slide over与分屏视图提供支持的关键组件.

2.内部改变

内部改变发生于用户界面中的视图尺寸或控制发生改变的时候.

以下为通常会引起内部改变的因素:

· 应用的内容改变.
· 应用支持国际化(internationalization).
· 应用支持动态类型(iOS)

当你的应用的内容改变的时候,新内容相对于旧的会需要一个不同的布局.这种情况发生于应用需要展示文本(text)或图片的时候.例如,一个新闻类应用需要根据单独的新闻文章的尺寸调整其布局.类似的,一个图片拼贴应用必须要处理图片尺寸与比例.

国际化是使你的应用可以适应不同语言地区与文化的过程.一个国际化的应用必须考虑到这些差异,并且正确展示其所支持的语言与地区.

国际化对于布局主要有三种影响.第一,当你将你的用户界面翻译成不同的语言时,标签(labels)需要不同大小的空间.例如,德语通常需要比英语更多的空间,日语通常需要更少.

第二,即使语言没有改变,不同地区用于展示日期与数字的格式不同.尽管这些改变通常比不同语言的改变更小,但是用户界面依然需要适用于这些在尺寸上轻微变化.

第三,改变语言不仅会影响文本的尺寸,也会影响布局的组织.不同的语言会使用不同的布局方向.例如,英语采用从左到右的布局方向,而阿拉伯语和希伯来语采用从右到左的布局方向.通常情况下,用户界面的元素顺序应该符合布局方向.如果在英文环境下一个按钮在视图的右下角,那么在阿拉伯环境下应该在左下角.

最后,如果你的iOS与应用支持动态类型,用户可以改变你应用中字体大小.这种操作会同时改变用户界面文字类元素(elements)的高度和宽度.如果在你的应用运行期间改变了字体大小,字体与布局要同时进行调整以适应这种改变.

3.自动布局vs.基于边界(Frame-Based)的布局

用户界面的主要布局方式有三种.你可以通过程序(programmatically)布局用户界面,你可以使用自动尺寸罩(autoresizing masks)自动响应外部改变,或者你可以使用自动布局.

传统上,应用会以程序的方式设定在视图层级中的每个视图的边框,然后展示出其用户界面.边界在上级视图的坐标系中定义视图的原点高度,宽度.

为了展示出用户界面,你必须为你视图层级中的每个视图计算出尺寸与位置.然后,如果改变发生,你必须要为所有受影响的视图重新计算边界.

在很多情况下,程序定义试图边界很强大很灵活.当改变发生,你可以做出任何改变.然而,因为你必须自己管理所有的改变,布局一个简单的用户界面需要大量的工作去设计,debug,维护.创建一个使用的用户界面的难度,会以指数级的方式增加.

你可以使用自动尺寸罩帮助减轻一些工作量.一个自动尺寸罩定义了当上级视图改变时一个视图的边界如何改变.这种方法简化了创建需要适应外部变化的布局.

然而,自动尺寸罩能够支持的布局较少.对于复杂的用户界面,你通常需要用你的程序上的改变增加自动尺寸罩.此外自动尺寸罩只适用于外部改变.他们不支持内部改变.

尽管自动尺寸罩仅仅是一种程序布局上的迭代提升(iterative improvement),自动布局代表了一种全新的范式.你需要考虑视图的关系,而不是边界.

自动布局使用一系列约束定义你的用户界面.约束通常代表了两个视图之间的关系.然后自动布局基于这些约束计算每个视图的尺寸与位置.然后使得布局自动响应内外部的改变.

layout_constraints_2x.png

设计一系列约束来创建具体行为的逻辑,与程序化的或面向对象的代码逻辑非常不同.幸运的是,应用自动布局,与应用任何其他编程任务没有不同.有两个基本的步骤:第一理解在基于约束的布局的背后的逻辑,然后你需要学习API.在你学习其他程序任务时,已经成功实现了这些步骤.自动布局也不例外.

本指导的余下部分可以让你易于掌握自动布局."无约束自动布局"一章描述的是一种高度抽象的方法用于简化创建自动布局支持的用户界面."约束解剖"一章为理解与应用自动布局提供了背景理论."在用户界面中使用约束"一章描述了设计自动布局的工具,"程序创建约束"和"自动布局菜谱"描述了API的细节.最后,"自动布局菜单"展示了很多不同复杂度的自动布局的事例.你可以学习,并且应用在自己的项目中,"Debugging自动布局"为修复出现的问题提供建议.

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

推荐阅读更多精彩内容