开始用Swift开发iOS 10 - 4 用Stack View设计UI

cover

前一篇开始用Swift开发iOS 10 - 3 介绍Auto Layout中提到Auto Layout工具栏有个stack按钮,这是Stack View功能。为了解决复杂UI时布局约束定义困难,Apple从iOS 9开始引入Stack View
这篇文章将学习到:

  1. Stack View布局UI。
  2. 用image views展示图片。
  3. 用内建的asset catalog管理图片。
  4. Size Classes适配Stack View

Stack View是什么

Stack View为在纵向或横向布置一个视图的集合,提供了一个流线型界面。可以用stack view将很多UI对象合成一个。视图嵌入一个stack view里以后,就不再需要定义自动布局约束.

Stack View管理它子视图的布局,然后自动提供布局约束。这意味着子视图已经准备好去适应不同的屏幕尺寸。此外,也可以嵌入一个stack view到另一个stack view来构建更复杂的用户界面。但是,这并不意味着不需要处理自动布局。仍然需要定义stack view的布局。这样不仅能够节约在创作每个UI元素的约束的时间,也可以轻松的从布局里来添加/移除视图。

Xcode提供两种方法使用Stack View

  1. 直接从Object library中拖出stack view(纵向或横向),然后把其他视图拖动stack view
  2. 选中一些视图,然后点击Interface Builder editor右下角一组按钮中的stack按钮

一个小程序

  • 新建项目 StackViewDemo

  • 向Xcode中添加图片

    • 从[图片](https://www.appcoda.com/resources/swift3/stackviewdemo- images.zip)下载所需图片,加压后有3组9张图片,每组有3张不同类型的图片,针对不同类型的设备:

      • user1.png ( non-Retina的一些老设备)
      • user1@2x.png (iPhone 4/4s/5/5s/6)
      • user1@3x.png (iPhone 6 Plus等高分辨的)
    • 拖动图片竟然xcode的asset catalog中,xcode会自动组织这些有规律的图片,使用时直接用user1,不需要靠后面的@2或@3。


  • Stack View布局title的label

    • 选择Main.storyboard,从Object library中拖出Vertical Stack View到storyboard中
    • 拖出一个label到stack view中。一旦label进入stack view中,它就自动调整大小以适应label
    • 修改label的title为“Instant Developer”,字体大小为40 points,font style为medium,字体颜色为红色
    • 另外拖出一个label到stack view中,修改label的title为“Get help from experts in 15 minutes”
    • 选择stack view,在属性检查器中修改Alignment参数为center,这样使stack view中的label水平居中对齐。

    多个视图在一起不方便选择时,可以用 shift + 右击


    stack view的几个属性:

    • axis stack view中对象是水平放置还是垂直放置,也就是Vertical Stack ViewHorizontal Stack View之间的切换
    • alignment stack view中对象的对齐方式
    • distribution

用Stack按钮布局多个图片

  • 拖动一个image view对象,并修改其image属性为user1
  • 同样的方法再添加两个image view对象,image属性分别为user2,user3。粗略调整图片的带下,放在一个水平,大概如下:
  • 选中三个image view,击Interface Builder editor右下角一组按钮中的stack按钮,则生成一个新的horizontal stack view。
  • 修改新生成的horizontal stack view的属性,spacing为 10,表示图片之间的间距,DistributionFill Equally
  • 同时选中两个stack view,点击stack 按钮,再生成一个新的大vertical stack view

为stack view添加布局约束

  • 选中大的stack view,添加space constraints,上,左右,分别为70,0,0

    添加约束后,如果出现布局问题,可通过issue indicator解决,可参考上一篇文章
  • 看预览assistant editor,查看其它设备会发现两个问题:
    • Instant Developer label文本在小屏幕设备被截断
    • 图片的宽高比改变了

选择Instant Developer label,修改Autoshrink属性为Minimum Font Size,值为20,这样就设置了label的字体可以变化,最小值为20 ,小屏幕就不会被截断了。
横向control-drag图片的stack view,选择Aspect Ratio,使图片的宽高比不变化。

在图片stack view下添加一个label

  • 拖动一个label到图片下,看到一个蓝色线后松开


  • 改变label的文本:
    Need help with your coding problems? We’ll find you the right developer who can help you in 15 minutes.
  • label的属性lines改为0,表示不限制行数
  • 选择大stack view,修改间距sapcing为10,修改Alignment为居中

用stack view布局Buttons

  • 添加两个Button:"Sign in" 和 "Sign up with Facebook"
  • 修改白字体,红背景,宽度为200
  • 选择两个Button生成vertical stack view,spacing为10
  • 为vertical stack view添加两个约束,水平居中和底边距20


  • 当把两个button聚合成stack view时,button的大小会自动调节到适宜大小,也就是"Sign up with Facebook"的宽度变为155 。需要再添加一个宽度约束,修改Constant值为200 。

Size Classes来调节Stack view

  • landscape orientation vs portrait orientation
    直译就是风景画方向和肖像画方向,其实就是指横屏和竖屏
  • 上面设计的UI看上去以不错了,但一直没有考虑的横屏的情况。因为横屏上下高度变小,原本在竖屏下适宜的stack view上边距,就有点大了,需要小一点。这也导致了,从iOS 8开始引入了一个新的UI设计概念Adaptive Layout(自适应布局),为此,Apple引入了Size Classes通过Size Classes 和 auto layout一起设计自适应UI。Size Classes仅仅是对屏幕进行了分类, 实际上的布局还是交给autolayout
  • Size Classes有两种类型:regularcompact(可以理解为大[R] 和 小[C])。而这两种类型应用在两个方向上:vertical (height)horizontal (width) ,就对应不同类型的设备:Regular width-Regular Height, Regular width-Compact Height, Compact width-Regular Height and Compact width-Compact Height


最新版本的Xcode已经为我们提供了不同设备和方向的Size Classes查看:

  • 选择上边距约束。在属性检查器中,点击Constant前面的+号,弹框中分别选择:Width:Any,Height:Compact,Gamunt:Any,后面的值为0,表示只有在Compact height下上边距为0
  • 为了更加简洁也可以在有些屏幕状态下把"Need help with your ..." label隐藏掉,就是height为0。也就是为label添加一个只有在Width:Any,Height:Compact,Gamunt:Any这个Size Classes下,的height约束。
    control-drag方法添加height约束:


选择现价的height约束,修改Constant为0;去除选中Installed,点击Installed前的+,弹出框选择Width:Any,Height:Compact,Gamunt:Any,并选择新加的Installed(height约束颜色变浅了,说明这个约束不是在任何状态下都有效的):

练习

还有考虑特殊的一些设备的情况,添加一些特殊的约束:

  • wR hR时,修改两个按钮的宽度为300
  • 在iphone 6/7 和一些老的iphone等设备竖屏时,修改"Need help with ..." label 字体为15
  • wR hR时,修改图像stack view的上下空间为30

代码

Beginning-iOS-Programming-with-Swift

说明

此文是学习appcode网站出的一本书 《Beginning iOS 10 Programming with Swift》 的一篇记录

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

推荐阅读更多精彩内容