Auto Layout VFL初探

VFL(Visual Format Language)是一种用于定义自动布局视图约束的说明性语言。Auto Layout的约束有很多属性,比如水平垂直布局,大小,间距,都可以通过VFL实现。以Visual Format String做为参数传给NSLayoutConstraint这个类的方法constraintWithVisualFormat(format:_,options:_,metrics:_,views:_)。这篇博客分为5个部分:VFL语法,layout options,metrics,layout guides和VFL的局限性.

VFL

#1 Visual Format String语法

1.Visual Format String由5个部分组成

Visual Format Language

除了3是必要部分,其余都是可选部分。下面来解释一下这5个部分

1表示view的方向。H:表示水平方向,V:表示垂直方向,如果没有指明,默认的是水平方向

2表示view与superview的关系。垂直方向上,view的top edge与superview的top edge之间的距离;水平方向上,view的leading edge与superview的leading edge之间的距离

3表示你正在布局的view

4表示与另外的view之间的联系

5表示view与superview的关系。垂直方向上,view的bottom edge与superview的bottom edge之间的距离;水平方向上,view的trailing edge与superview的trailing edge之间的距离

2.常见的symbol含义

| 表示superview

-表示standard spacing,通常是8 points;-20-表示spacing为20 points

@250表示约束的优先级,范围在0-1000。250表示低优先级,750表示高优先级,1000表示required priority

例子:

H:|-[icon(==iconDate)]-20-[iconLabel(120@250)]-20@750-[iconDate(>=50)]-|

H:表示水平方向

|-[icon表示icon的leading edge与superview的leading edge之间的距离是standard spacing(8 points)

==iconDate表示icon的宽度与iconDate的宽度一样

]-20-[iconLabel表示icon的trailing edge与iconLabel的leading edge之间的距离是20 points

[iconLabel(120@250)]表示iconLabel的宽度是120points,它的约束优先级是低优先级,如果发生约束冲突,以auto layout为准

-20@750-表示iconLabel的trailing edge与iconDate的leading edge之间的距离是20 points,它的优先级是高优先级,如果发生约束冲突,还是仅此约束,auto layout无法改变

[iconDate(>=50)]表示iconDate的宽度应该>=50 points

-|表示iconDate的trailing edge与superview的trailing edge之间的距离为standard spacing(8 points)

3.约束练习

练习一:这个约束比较简单,直接看代码吧,我就不解释了。

simulator
viewDidLoad()

练习二:

simulator

--添加这几个view到views字典中

viewDidLoad()

--补充添加这几个constraint.为summaryLabel和welcomeLabel添加水平约束;另外,添加iconImageView和appImageView之间的,appImageView和welcomeLabel之间的,welcomeLabel和summaryLabel之间的,summaryLabel和pageControl之间的垂直约束。imageControl的高度设为9 points。

viewDidLoad()

但此时,位置还是有所偏移仍然没有达到预期效果。

预期效果是这样的!

#2 Layout Options

NSLayoutFormatOptions的作用:操控垂直于当前方向布局的约束。什么意思?我的理解是,如果已知a的水平约束,a与b的垂直约束,那么就可以用layout options可以求b的水平约束,它的水平约束和a一样(当前方向布局是垂直的,所以操控的是水平方向的约束)。

好处在于,使得代码更简洁;

看练习:

1.更新iconImageView,appNameLabel,skipButton的约束。

移除nameLabel和skipButton的vertical constraints

这里,options的参数是[.AlignAllCenterY],作用是根据icon的位置,水平方向中心对齐nameLabel,skipButton和icon。

2.更新welcomeLabel和summaryLabel的约束。删掉welcomeHorizontalConstraints。

更新welcomeToSummaryVerticalConstraints

options的参数[.AlignAllLeading, .AlignAllTrailing]的意思是welcomeLabel和summaryLabel的前后与superview的前后部间隔都是15 points。为什么?因为对summaryLabel已经设置了horizontal constraints,它与superview的前后间距是15points。welcomeLabel和summaryLabel在水平方向上的约束是一样的。

summaryHorizontalConstraints

3.更新summaryToPageVerticalConstraints

根据summaryLabel的水平中心给pageControl加水平约束

更新imageToWelcomeVerticalConstraints

同上

#3 Metrics

Metrics说白了就是VFL字符串里的一个字典。

添加常量,更新约束。hp,iconImageViewWidth的作用就是占位符。

在变量前声明此常量
在viewDidLoad()里声明
更新约束

#4 Layout Guides

之前我的博客中对layout guide有介绍:UIButton,UILabel,UIImage与Auto Layout

Layout Guides分为两种:top layout guide和bottom layout guide,用来指出bar的下/上界,它们继承自UILayoutSupport,而不是UIView。

更新iconVerticalConstraints和views字典

viewDidLoad()

#5 VFL局限性

局限一 :中心对齐问题

回顾一下,在layout options中,我们用到了.AlignAllCenterY和.AlignAllCenterX。在水平方向中心对齐icon,nameLabel和skipButton时,我们也就是在根据icon的垂直约束来确定nameLabel和skipButton的垂直中心位置。这个的前提是,icon的约束能确定它的垂直中心位置。换句话说,如果icon的约束不能确定它的垂直中心位置,.AlignAllCenterY就不起作用。

局限二:multiplier问题

比方说,你想设定一个label的宽度是superview宽度的60%,multiplier就无法设定.只能用constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:

参考博客:

Auto Layout Visual Format Language Tutorial

初识Auto Layout的VFL

Auto Layout Guide: Visual Format Language

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

推荐阅读更多精彩内容