AutoLayout布局(storyboard)

苹果都出SwiftUI了,为什么要学AutoLayout?因为SwiftUI支持iOS13+、macOS10.15+,未来几年时间为了兼容老版系统,还得用AutoLayout布局。一直以来,我虽然在做iOS开发,但很少用storyboard做控件约束,所以本文主要用storyboard,介绍一些入门级概念。

相信能来看AutoLayout相关内容的同学,对iOS或者macOS开发已经了解的很多了,Frame、Bounds等概念就在赘述了。

AutoLayout是相对布局,只要你适应了这种布局方式,也很方便的,个人感觉比手撸代码快得多。

AutoLayout相关属性

属性 含义
top 顶部
bottom 底部
leading(left) 左边
trailing(right) 右边
height 高度
width 宽度
center X X轴中心
center Y Y轴中心
baseline 文字的基线位置

storyboard/xib中工具介绍

image

上面的五个按钮分别是:update frames, align,add new constaints,resolve autolayout issues,embed in。

update frames 作用是刷新frame,没什么好说的。

align 按钮点开之后,可以看到align面板上面有9种约束关系设置。其中前面7种需要同时至少选择2个控件后才能允许设置,其中最后2个Horizontally in Container和Vertically in Contaoner是约束选中的控件与父视图的关系。每种关系都可以通过右边的输入框输入一个constant常量,如果不输入默认为0。

add new constaints面板最上部用来设置选择的控件四个边top,bottom,leading,trailing距离父视图或相邻的控件之间的间距。
对需要设置的属性点击红色虚线后表示设置此方向的属性。

Width和Heigth用来设置控件的高和宽

Equal Widths: 选中的至少2个控件,约定它们的宽度相同

Equal Heigths:选中的至少2个控件,约定它们的高度相同

Aspect Ratio:选中控件,约定高度和宽度的比例关系。

Align:可以下拉选择不同的属性,类似通过Align面板设置的各种属性,因此这里可以代替大部分前面Align面板中大部分的约束设置的操作。

resolve autolayout issues面板中,上面一组菜单是当前选中控件的操作,下面一组是整个viewcontroller的操作。用于更新Frame,更新约束,自动增加缺少的约束,基于系统建议重置约束,删除约束。

embed in面板就是给当前view或者当前viewcontroller添加Stack View或者Navigation Controller。如果需要去掉Stack View,从Editor菜单选择Unembed 即可。

storyboard/xib中AutoLayout关系描述

当我们给一个view添加一些约束之后,会出现:

image

Constraints里面的某些表达式,看着一脸懵逼,那么这些表达式是什么意思呢?

例如:Safe Area.trailing = View.trailing + 20

当前view的右边距离 Safe Area的右边是20。

View.top = Safe Area.top + 137 当前view的顶部距离 Safe Area的顶部是137,也可以理解为Safe Area的顶部到view的顶部距离是137

Stack View.centerX = centerX @999 这条约束后面多了一个@999,999是该条越是的优先级,默认优先级是1000是不会在表达式中显示的,当某些情况下,两条约束产生冲突时,程序为按照优先级执行。

Size Classes(仅iOS)

注:iOS中才会Size Classes,macOS没有

很多同学在看到Size Classes时,脑海中无所个问号,根据官方的解释就是,对于任何设备来说,界面的宽度和高度都只分为三种描述:紧凑,任意和宽松。这样开发者便可以无视设备具体的尺寸,而是对这两类和它们的组合进行适配。更通俗的理解就是,Size Classes把宽度和高度各分为3种情况(紧凑、任意、宽松),每条约束可以根据这紧凑,任意和宽松进行调整。

Any(任意):A

Regular(常规):R

Compact(紧凑):C

对应关系

iPad iPhone
竖屏 横屏
高(H) R R C
宽(W) R C C R(Plus)

看起很复杂?没关系,这个不需要记住,看一张图就明白了

image

在设备选择区域,可以看到 view as:iPhone 11(wC hR) ,其中括号中的wC hR是当前设备竖屏状态下高宽度对应关系,我这里选择的iPhone11 可以看到在竖屏状态下,宽度是Compact(紧凑),高度是Regular(常规)。注意在当前状态下添加的约束并不是只适用于当前状态。

在上图中,我们在文档大纲中选择了一条约束,在size inspector面板上出现了该约束的相关属性,在某些属性前面有一个+按钮,点击这个按钮会弹出图中的面板,面板中可以指定该约束的高宽度的对应关系,添加之后,会出现一条相同的属性,该属性既是我们指定的状态的属性,例如,在上面面板中,我们把宽度指定为Regular(常规),高度为Compact(紧凑),添加之后,改变值为100,那么在横屏状态下,该约束的值为100。如果需要对一条约束指定,可以点击installed属性前面的 + 按钮,添加对应的状态。

Intrinsic Content Size

对于文本/图片等一些视图控件,可以通过其内在content推算出控件的大小。不是所有的控件都有Intrinsic Content Size。按钮,文本label,文字输入TextField,TextView,ImageView都可以根据内在的content内容计算控件的大小。

基于控件的内容content,有2个特定的约束:content hugging 收缩约束 和 content compression 扩张约束,这2个约束简称为CHCR。

image

IntrinsicHeight代表内部内容的高,IntrinsicWidth代表内部内容的宽

content compression的约束条件:

 View.height >= IntrinsicHeight
 View.width >= IntrinsicWidth

content hugging的约束条件:

 View.height <= IntrinsicHeight
 View.width <= IntrinsicWidth

从这几组约束来看,如果需要完整的显示内容就需要content compression的优先级尽量高,而如果需要尽量显示的紧凑一些占用空间小一些可以将content hugging优先级尽量设置高一些。

部分知识点摘录自《macOS 应用开发基础教程》
个人博客:https://note.qingque.me

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