[iOS] Storyboard (2) --入门:约束篇

Storyboard 系列文章
[iOS] Storyboard (1) -- 入门:API 篇
[iOS] Storyboard (2) --入门:约束篇
[iOS] Storyboard (3) -- 使用:常用Tips
[iOS] Storyboard (4) -- 实践:问题总结
[iOS] Storyboard (4) -- 实践:UIScrollView
[iOS] Storyboard (4) -- 实践:UICollectionView

一个完整的 Storyboard 大概是这个样子:

主要分为三个红框区域和三个篮框工具条:

  1. 控件列表及层级关系
  2. UI 效果
  3. 属性设置、Frame布局约束等
  4. 视图模式切换
  5. Autolayout 布局约束
  6. 设备选择

这里的第一部分和第二部分很简单,第一部分是每个控制器内所包含的视图层级关系,多个控制器会依次并列显示在这里;第二部分是我们主要的工作区域,添加控件,也是最终的 UI效果预览区;

第三部分:属性设置区

总共有六个选项,从左到右依次为:
Show the File Inspector(文件检查器)、
Show the Quick help Inspector(快速帮助检查器)、
Show the Identity Inspector(标识检查器)、
Show the Attributes Inspector(属性检察器)、
Show the Size Inspector(尺寸检查器)以及
Show the Connections Inspector(连接关系检查器);

在左侧控件列表选中的控件不同时,各个选项下的内容也不尽相同,可以都点看看一些大致有哪些东西;其中,最常用的是第三个到第五个:

Show the Identity Inspector(标识检查器)

前面说了,这里的内容,在选择不同的控件时,显示的内容略有区别,下面是选中 UIViewController 时的内容:

这里经常用到的是下面几个:
Custom Class
Custom Class 下的 Class 是关联我们新建的对应控件的子类的(即 .h/.m);

** Identity**
Identity 下的 Storyboard ID,在我们使用 Storyboard 时会经常使用到这个,一般设置为和类名一致即可!

User Defined Runtime Attributes
这里使用 KVC 的特性, 设置类的 key-path 属性, 在运行时通过 key-path 来设置对应控件的属性, 在属性面板没有找到设置的属性, 都可以在这里进行添加,这里举一个🌰: 设置视图圆角
一种方式是通过 layer 的属性进行设置, 如果是代码的话,会是这样:

view.layer.cornerRadius = 6;
view.layer.borderWidth = 1;

而在这里可以这样添加:

需要注意的是, 在设置边框颜色时,因为这里只能选择 UIColor, 而实际需要的是 CGColor, 解决方法就是, 给 layer 写个扩展, 添加一个自定义属性, 然后在这里设置这个属性, 即: bColor, 通过这个属性转换一下即可; 这里的扩展大概是这样:

// CALayer+LQLayer.h
#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface CALayer (LQLayer)

@property (nonatomic, weak) UIColor *bColor;
@end

NS_ASSUME_NONNULL_END

// CALayer+LQLayer.m
#import "CALayer+LQLayer.h"

@implementation CALayer (LQLayer)

@dynamic bColor;

-(void)setBColor:(UIColor *)bColor {
    
    self.borderColor = bColor.CGColor;
}
@end
Show the Attributes Inspector(属性检察器)

这里是我们设置控件的相应属性的地方,根据选择的控件不同,内容差别比较大,下面是选中 UIView 时的内容:

可以不同的控件都选中看一下,每种控件的大部分属性都可以在这里进行设置,和使用代码时的设置是一样的;

Show the Size Inspector(尺寸检查器)

这里主要是现实各个控件的坐标及约束信息的,修改控件坐标、约束,都可以在这里进行操作,这里也是我们经常使用的;下面是选中 UIView 的时候的内容:

View 下主要是坐标信息,直接修改 x/y/width/height 的值,即可;

Constraints 是约束信息,给控件添加约束后,这里会显示所有的约束,如果我们想修改某个约束,也是在这里进行;

当我们想修改某条约束,直接点击约束后面的 Edit,或者直接双击该约束,会跳到约束的编辑页:

控件的约束,大致是按下面的公式进行计算:

First Item = Multiplier × Second Item + Constant
First Item:需要添加约束的视图
Relation:关系,Equal(=)、Less Than or Equal to(<=)、Greater Than or Equal to(>=)
Second Item:相对某个视图的约束,可以选择参考的是哪个视图和该视图的哪个属性
Constant:常量
Priority:优先级,一般不做修改
Multiplier:倍数

可以看下下面这个示例,约束是 绿色的宽是红色宽的2倍加10 :

即:GreenView.width = 2 × RedView.width + 10

第四部分:视图面板

这里有四个按钮:控件库、Storyboard 面板、Storyboard & Code 双面板、XML面板;
主要用到的是前三个,在需要将 Storyboard 中的控件连线到Code 中时,需要切换为 Storyboard & Code 双面板(第三个);
这里功能比较简单,不做过多介绍;

第五部分:约束

这部分主要是我们为各个控件添加约束的,五个按钮从左到右依次是:Update FramesEmbed InAlignAdd New ConstrainsResolve Auto Layout Issues

Update Frames:更新约束

经常使用
在修改了某个控件的约束后,如果视图没有立即变化,可在修改结束后,点击这个按钮,进行更新;

PS:需要注意,该按钮大部分时间下是灰色不可点击的,只有在约束有更新,并切选中的视图是其父视图的时候,才会变为可点击的黑色;

Embed In:嵌入

常使用


可以看到我们可以将选中的视图,嵌入到某些视图/视图控制器中;

Align:对齐

主要是需要将多个视图对齐时使用

屏幕快照 2019-01-16 下午2.48.21.png

Leading Edges:左对齐
Trailing Edges:右对齐
Top Edges:顶部对齐
Bottom Edges:底部对齐
Horizontal Centers:垂直居中对齐
Vertrical Centers:水平居中对齐
Baselines:基线对齐
Horizontally in container:和父视图的垂直中心线对齐
Verically in Container :和父视图的水平中心线对齐

除了最后两个,前面的需要在选中多个视图时,才是可选的;

选中多个视图:按住Command键后即可多选

Add New Constrains:新加约束

主要是为单个控件添加约束的面板:

上下总共有三部分,第一部分是设置距离临近控件的间隙,设置后红色的虚线会变为红色的实线,也可以点击实线/虚线进行取消/添加约束;

这里有个复选框:Constrain to margins,勾选后,会在左右两边各有8pt 的间隙,在我们设置全屏的时候,如果不取消勾选,是无法全屏的,一般情况下,我们直接取消勾选即可;

第二部分,设置控件固定的宽高;

第三部分,看名称也能猜到,等宽、等高、等比;

Resolve Auto Layout Issues:解决布局错误

这里主要分为两部分:上半部分:Selected Views,只会作用在所选择的控件上;下半部分:All Views in View Controller,会作用在所有的视图上;每部分的功能都一样,只不过作用的范围不同,使用的时候需要注意这个;

Update Constraint Constants :更新约束,一般不使用这个更新,而是使用 Upadte Frames
Add Missing Constraints :如果我们添加的约束不足,系统推荐补全约束;一般不使用这个推荐,根据提示的不足,手动添加缺失的约束;使用这个的时候会有莫名其妙的问题
Reset to Suggested Constraints:重置为系统推荐的约束,同上面那个,一般不使用
Clear Constraints:清除约束。使用的时候需要注意是清除所有的还是某个控件的

这里常用的也就是最后一个 Clear Constraints,在我们添加约束遇到无法解决的问题,或者修改的太多,直接清除,然后重新添加;

第六部分:设备

点击后,可以选择不同的设备以及横竖屏,并可以调节画布的大小

这里需要注意的是 Vary for Traits(不同特征)按钮,如果需要在不同的设备或者不同的设备方向有不同的 UI 布局,可以使用这个功能;

例如, 我们先选择竖屏, 对控件进行了布局约束, 然后再选择横屏时, 这时候的UI布局可能就不是我们希望的, 也就是说, 在横竖屏状态下, UI 的布局是不一样的;

我们可以这样操作, 在选择横屏后, 点击 Vary for Traits , 选择 width & height, 然后进行横屏的布局;

点击后会弹出一个选择框:

选择特征的依据,Width、Height 或者 两者都选,然后点击空白区域,弹框消失;这时候,面板会变为这样:

点击手机模型图标,会弹出所有支持的设备,可以选择需要的设备,然后进行控件/约束的添加。

注意, 在未完成布局前, 不要点击 Done Varying, 横屏状态下的所有控件布局结束后, 再点击 Done Varying; 然后, 运行模拟器, 切换横竖屏, 就会看到不同的布局

完成后就是这个样子 ⤵️


横竖屏不同的UI布局

连线添加约束

除了使用上面的面板来为控件添加约束,还有一种方式是连线:
选中控件,按住 CTRL 键,点击左键,拖拽到需要参考的另一个控件上:

在弹出框中选择要添加的属性:

Horizontal Spacing:横向间距
Vertical Spacing:垂直间距
Vertical Baseline Standard Spacing:垂直基线标准间距
Top:顶部
Center Vertically:垂直中心点
First Baseline:第一基线
Bottom:底部
Leading:左侧
Center Horizontally:水平中心点
Trailing:右侧
Equal Widths:等宽
Equal Heights:等高
Aspect Ratio:等比

最后两个是操作的提醒:只按 CTRL 连一次线只能添加一个属性,
同时按住 CTRL + Shift,可以选择多个属性。

参考文章

iOS 10可视化编程之约束篇
iOS Storyboard约束详解(附gif图)

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