Auto Layout VFL初探

VFL(Visual Format Language)是一種用于定義自動布局視圖約束的說明性語言泌参。Auto Layout的約束有很多屬性霎桅,比如水平垂直布局旅择,大小宣赔,間距预麸,都可以通過VFL實現(xiàn)。以Visual Format String做為參數(shù)傳給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的關(guān)系丐巫。垂直方向上谈况,view的top edge與superview的top edge之間的距離;水平方向上递胧,view的leading edge與superview的leading edge之間的距離

3表示你正在布局的view

4表示與另外的view之間的聯(lián)系

5表示view與superview的關(guān)系碑韵。垂直方向上,view的bottom edge與superview的bottom edge之間的距離缎脾;水平方向上祝闻,view的trailing edge與superview的trailing edge之間的距離

2.常見的symbol含義

| 表示superview

-表示standard spacing,通常是8 points遗菠;-20-表示spacing為20 points

@250表示約束的優(yōu)先級联喘,范圍在0-1000。250表示低優(yōu)先級辙纬,750表示高優(yōu)先級豁遭,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,它的約束優(yōu)先級是低優(yōu)先級贺拣,如果發(fā)生約束沖突蓖谢,以auto layout為準

-20@750-表示iconLabel的trailing edge與iconDate的leading edge之間的距離是20 points,它的優(yōu)先級是高優(yōu)先級譬涡,如果發(fā)生約束沖突闪幽,還是僅此約束,auto layout無法改變

[iconDate(>=50)]表示iconDate的寬度應(yīng)該>=50 points

-|表示iconDate的trailing edge與superview的trailing edge之間的距離為standard spacing(8 points)

3.約束練習(xí)

練習(xí)一:這個約束比較簡單昂儒,直接看代碼吧沟使,我就不解釋了委可。

simulator
viewDidLoad()

練習(xí)二:

simulator

--添加這幾個view到views字典中

viewDidLoad()

--補充添加這幾個constraint.為summaryLabel和welcomeLabel添加水平約束渊跋;另外,添加iconImageView和appImageView之間的着倾,appImageView和welcomeLabel之間的拾酝,welcomeLabel和summaryLabel之間的,summaryLabel和pageControl之間的垂直約束卡者。imageControl的高度設(shè)為9 points蒿囤。

viewDidLoad()

但此時,位置還是有所偏移仍然沒有達到預(yù)期效果崇决。

預(yù)期效果是這樣的材诽!

#2 Layout Options

NSLayoutFormatOptions的作用:操控垂直于當前方向布局的約束底挫。什么意思?我的理解是脸侥,如果已知a的水平約束建邓,a與b的垂直約束,那么就可以用layout options可以求b的水平約束睁枕,它的水平約束和a一樣(當前方向布局是垂直的官边,所以操控的是水平方向的約束)。

好處在于外遇,使得代碼更簡潔注簿;

看練習(xí):

1.更新iconImageView,appNameLabel跳仿,skipButton的約束诡渴。

移除nameLabel和skipButton的vertical constraints

這里,options的參數(shù)是[.AlignAllCenterY],作用是根據(jù)icon的位置菲语,水平方向中心對齊nameLabel玩徊,skipButton和icon。

2.更新welcomeLabel和summaryLabel的約束谨究。刪掉welcomeHorizontalConstraints恩袱。

更新welcomeToSummaryVerticalConstraints

options的參數(shù)[.AlignAllLeading, .AlignAllTrailing]的意思是welcomeLabel和summaryLabel的前后與superview的前后部間隔都是15 points。為什么胶哲?因為對summaryLabel已經(jīng)設(shè)置了horizontal constraints,它與superview的前后間距是15points畔塔。welcomeLabel和summaryLabel在水平方向上的約束是一樣的。

summaryHorizontalConstraints

3.更新summaryToPageVerticalConstraints

根據(jù)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時激况,我們也就是在根據(jù)icon的垂直約束來確定nameLabel和skipButton的垂直中心位置。這個的前提是玛歌,icon的約束能確定它的垂直中心位置。換句話說擎椰,如果icon的約束不能確定它的垂直中心位置沾鳄,.AlignAllCenterY就不起作用。

局限二:multiplier問題

比方說确憨,你想設(shè)定一個label的寬度是superview寬度的60%译荞,multiplier就無法設(shè)定.只能用constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:

參考博客:

Auto Layout Visual Format Language Tutorial

初識Auto Layout的VFL

Auto Layout Guide: Visual Format Language

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末休弃,一起剝皮案震驚了整個濱河市吞歼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌塔猾,老刑警劉巖篙骡,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異丈甸,居然都是意外死亡糯俗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門睦擂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來得湘,“玉大人,你說我怎么就攤上這事顿仇√哉” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵臼闻,是天一觀的道長鸿吆。 經(jīng)常有香客問我,道長述呐,這世上最難降的妖魔是什么惩淳? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮乓搬,結(jié)果婚禮上思犁,老公的妹妹穿的比我還像新娘。我一直安慰自己缤谎,他們只是感情好抒倚,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坷澡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上频敛,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天项郊,我揣著相機與錄音,去河邊找鬼斟赚。 笑死着降,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的拗军。 我是一名探鬼主播任洞,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼发侵!你這毒婦竟也來了交掏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤刃鳄,失蹤者是張志新(化名)和其女友劉穎盅弛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叔锐,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡挪鹏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了愉烙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讨盒。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖步责,靈堂內(nèi)的尸體忽然破棺而出催植,到底是詐尸還是另有隱情,我是刑警寧澤勺择,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布创南,位于F島的核電站,受9級特大地震影響省核,放射性物質(zhì)發(fā)生泄漏稿辙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一气忠、第九天 我趴在偏房一處隱蔽的房頂上張望邻储。 院中可真熱鬧,春花似錦旧噪、人聲如沸吨娜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宦赠。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勾扭,已是汗流浹背毡琉。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妙色,地道東北人桅滋。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像身辨,于是被迫代替她去往敵國和親丐谋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容