Start Developing iOS Apps (Swift)->构建基础UI(三)

采用自动布局(Auto Layout)

Auto Layout是一个强大的布局引擎,它帮助你设计自适应的布局,用以动态的应对任何屏幕尺寸的改变。你使用约束(constraints)来描述布局。约束是用来解释一个元素相对于其他元素的位置,以及这个元素自身的尺寸。Auto Layout根据约束来动态的计算每个元素的尺寸和位置。

定义布局的一种方便方法是使用栈视图(UIStackView)。栈视图提供一种简化的界面,用于在列和行上布局视图集合。栈视图使用钩子(hook)下的Auto Layout来计算它管理的所有视图的尺寸和位置。这使你可以轻松访问Auto Layout的全部功能,同时大大降低布局的复杂性。

想要采用Auto Layout,把界面中已存在的元素包裹到一个栈视图中,然后添加必要的约束来确定栈视图在场景中的位置。

给菜品场景添加Auto Laout约束

  1. 点击Standard editor按钮回到标准编辑器。


    standard_toggle_2x.png

    通过点击Navigator和Utilities按钮,展开project navigator和utility area。

  2. 按住Shift键,并选择text field、label、以及button。


    BBUI_AL_shift_select_2x.png
  3. 在画布的右下,点击Embed In Stack(嵌入栈)按钮。(或者,选择Editor > Embed in > Stack View。)


    BBUI_AL_stackmenu_2x.png

    Xcode 把用户界面元素包裹在一个栈视图中,把它们堆在一起。Xcode分析现有的布局,确定这些元素应该垂直而不是水平堆放。


    BBUI_AL_stack_2x.png
  4. 如有必要,打开大纲视图。选择Stack View对象。


    BBUI_AL_outlineview_2x.png
  5. 在Attributes检查器中,在Spacing字段键入8。按下回车键。
    你将注意到用户界面元素之间的垂直距离变大,并且栈视图也随之变大。


    BBUI_AL_stackspaced_2x.png
  6. 在画布底部的右侧,打开Add New Constraints(添加新约束)菜单。


    BBUI_AL_pinmenu_2x.png
  7. 在上面的“Spacing to nearest neighbor”(相邻的最近空间),点击两个水平约束和上面的垂直约束来选中它们。
    当它们选中的时候会变成红色。
    这些约束表示了与最近相邻的 前导、尾部、以及顶部之间的间隔。在这个上下文中,最近相邻这个术语的意思是最接近用户界面元素的边界,这个元素可以是superview,也可以是其他用户界面元素,也可以是边缘(一般是指引导线)。因为“Constrain to margins”(约束到边缘)复选框被选中,本例中的栈视图将约束到超视图(superview)的左右边缘。这提供了栈视图和场景边缘之间的空间。
    另一方面,栈顶部与场景顶部布局引导线是相对约束关系。如果状态条可见,则所有的顶部布局引导线都在状态条之下。如果没有,则它在场景顶部之下。所以,你需要在栈视图和布局引导线之间增加一点空间。
  8. 在左右的框中填入0,在顶部的框中填入20。
  9. 在Update Frame旁边的弹出菜单中,选择Item of New Constraints。
    这将导致Interface Builder在创建约束是自动更新受影响视图的框架(frame)。Add New Constraints 菜单看上去是这样的:


    BBUI_AL_stackconstraints_2x.png
  10. 在Add New Constraints菜单中,点击 Add 3 Constraints按钮。
    菜品场景用户界面看上去会是如此:


    BBUI_AL_stackfinal_2x.png

    注意现在text field仍然没有扩展到场景的边缘。添加约束来修改它。

让text field的宽度适应栈视图

  1. 在storyboard中,选中菜品场景中的text field。
  2. 在画布底部的右侧,再次打开Add New Constraints菜单。


    AL_pinmenu_2x.png
  3. 在上面的“Spacing to nearest neighbor”(相邻的最近空间),点击右侧水平约束来选中它们。当选中时,它变成红色。
  4. 在右边的框中填入0。
  5. 在Update Frame旁边的弹出菜单中,选择Item of New Constraints。
    Add New Constraints 菜单看上去是这样的:


    BBUI_AL_textfieldconstraint_2x.png
  6. 在Add New Constraints菜单中,点击 Add 1 Constraints按钮。
    菜品场景用户界面看上去会是如此:


    BBUI_AL_textfieldfinal_2x.png

检查点:在iOS模拟器中运行应用。
通过选择Hardware > Rotate Left 和 Hardware > Rotate Right (或者 Command-Left Arrow 和 Command-Right Arrow)来旋转模拟器。注意text field如何随着设备的方向和屏幕尺寸的改变而变长和缩短。同时也注意一下状态栏在风景方向的时候会消失。

点击text field的内部,使用屏幕键盘输入文本(如果愿意,也可以通过选择Hardware > Keyboard > Connect Hardware Keyboard来使用电脑键盘)。


BBUI_sim_finalUI_2x.png

检查Auto Layout

如果你没有得到你想要的行为,使用自动布局调试功能来帮助你。可以使用Update Frames按钮和Resolve Auto Layout Issues(解析自动布局)菜单来访问这些功能。


BBUI_AL_resolvemenu_2x.png

如果收到错放视图的警告,使用Update Frames按钮。这个按钮更新选中的视图及其所有子视图的frame。选择场景视图控制器来更新场景中的所有视图。你也可以通过按住Option再点击Update Frame按钮来仅更新选中的视图。

如果布局没有按照你的期望行为,点击Resolve Auto Layout Issues按钮来打开一个调试命令菜单。这个菜单中的命令有两种形式。

一种影响当前选中的视图。另一种影响所有在视图控制器中的视图。如果所有的命令都变灰,选择场景的视图控制器或者其中一个视图然后再重新打开菜单。

选择Reset to Suggested Constraints(重置为建议的约束)让Xcode使用一些列可用的约束来更新你的界面。选择Clear Constraints(清空约束)来移除用户界面中的所有约束,然后根据前面的介绍来重新设置约束。


BBUI_AL_resolvemenu_small_2x.png

总结

在本课中,你熟悉了Xcode 项目的内容,并使用其中的一些工具来设计和运行了iOS 应用。你还构建了一个简单的用户界面。

虽然这个项目的场景还没有完成,但是基本的用户界面已经有了。确保你的布局从一开始就健壮且可扩展,这样就有了一个坚实的基础。

注意

要想看本课完整的例子项目,下载这个文件并在Xcode中查看。
Download File

(构建基础UI结束。明天是新的一章。)

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

推荐阅读更多精彩内容