iOS開發(fā)之VFL布局總結(jié)

VFL是蘋果推出的用來AutoLayout布局的一門比較形象的語言, 本身為字符串,雖然用起來比較麻煩, 但是相比直接使用蘋果的另一個(gè)套布局方案要少寫一些代碼, 那么問題來了, github上那么多自動(dòng)布局的框架, 簡單又好用, 為什么要用這么復(fù)雜的代碼去布局呢, 之前我也這么想, 直到有一天自己想封裝一個(gè)框架的的時(shí)候才發(fā)現(xiàn), 不能處處依賴別人的框架去封裝, 因?yàn)檫@樣的話, 你封裝的框架幾乎沒法用. 舉個(gè)例子, 假設(shè)你的框架用了AFN的2.0版本, 那么對(duì)于使用框架的人來說, 他們項(xiàng)目中如果使用了AFN3.0, 那么肯定出出現(xiàn)一大堆兼容問題, 因此對(duì)于自己的封裝的框架, 要以原生為主. 廢話不多說 下面總結(jié)一下我半天的的學(xué)習(xí)成果: VFL布局

下面是VFL使用的一個(gè)核心方法

+ (NSArray<__kindof NSLayoutConstraint *> *)constraintsWithVisualFormat:(NSString *)format 
  options:(NSLayoutFormatOptions)opts 
  metrics:(nullable NSDictionary<NSString *,id> *)metrics 
    views:(NSDictionary<NSString *, id> *)views;

該方法一共有四個(gè)參數(shù), 接下來將一一講解四個(gè)參數(shù)的含義及其使用:

  1. format參數(shù): 這個(gè)是具體布局的字符串,形如 @"V:|-10-[view1(50.0)]-20-[view2(50.0)]" 稍后再講解此字符串的意思;
  2. option參數(shù): 這個(gè)參數(shù)是一個(gè)可復(fù)選的參數(shù), 主要用來布局view的對(duì)齊方式;
  3. metrics參數(shù): 這個(gè)參數(shù)是替換VFL字符串中的變量用的, 如果這么寫: @{@"topMargin":@10} 則第一條中的布局可以替換成下面的寫法: @"V:|-10-[view1(50.0)]-20-[view2(50.0)]" 其實(shí)就是替換字符串中的變量使用;
  4. views參數(shù): 這個(gè)參數(shù)是用來存儲(chǔ)本條VFL語句中所有用到的View, 可以直接創(chuàng)建字典 @{@"view1":view1, @"view2":view2} 對(duì)于這個(gè)參數(shù)蘋果有一個(gè)特定的宏, NSDictionaryOfVariableBindings() 因此也可以這樣寫 NSDictionaryOfVariableBindings(view1, view2) ;

該方法返回的是一個(gè)裝有約束的數(shù)組集合;可以直接添加到設(shè)定約束view的父view上;

如果你對(duì)上面的解釋不太理解下面用代碼具體舉個(gè)列子,相信你立馬會(huì)恍然大悟

- (void)viewDidLoad {
    [super viewDidLoad];
    [self testConstraint];
    
}
- (void)testConstraint {//測試布局

    UIView *supView1 = [[UIView alloc] init];
    supView1.backgroundColor =  [UIColor blueColor];
    
    UIView *supView2 = [[UIView alloc] init];
    supView2.backgroundColor =  [UIColor blueColor];

    [self.view addSubview:supView1];
    [self.view addSubview:supView2];
    
    
    //由于AutoLayout布局和Autoresizing布局是沖突的,因此要使用AutoLayout必須要關(guān)閉Autoresizing
    self.view.translatesAutoresizingMaskIntoConstraints = NO;
    supView2.translatesAutoresizingMaskIntoConstraints = NO;
    supView1.translatesAutoresizingMaskIntoConstraints = NO;
    
    
    
    //此語句的意思是 垂直方向: supView1距離父view的距離為 topMargin,
    //supView1的垂直方向的寬度為50.0, supView2距離supView1為20, 并且高度也為50.0;
    NSString *top = @"V:|-topMargin-[supView1(50.0)]-20-[supView2(50.0)]";
    //解釋方法同上
    NSString *left = @"H:|-10-[supView1(50.0)]";
    NSString *v2T = @"[supView2(60.0)]";
    
    
    //此處需要對(duì)topMargin參數(shù)進(jìn)行解釋, 其實(shí)就是給topMargin賦值;
    NSArray *s1T = [NSLayoutConstraint constraintsWithVisualFormat:top options:NSLayoutFormatAlignAllRight metrics:@{@"topMargin":@100} views:NSDictionaryOfVariableBindings(supView1, supView2)];

    NSArray *s1L = [NSLayoutConstraint constraintsWithVisualFormat:left options:0 metrics:nil views:NSDictionaryOfVariableBindings(supView1)];
    NSArray *v2Tc = [NSLayoutConstraint constraintsWithVisualFormat:v2T options:0 metrics:nil views:NSDictionaryOfVariableBindings(supView2)];
    
    //一般需要把約束添加到父view上
    [self.view addConstraints:v2Tc];
    [self.view addConstraints:s1T];
    [self.view addConstraints:s1L];

}

效果如下圖:

40155A04-EA83-4B25-A802-B601F830EA29.png

上面的例子只是簡單的使用了一下VFL語句, 其實(shí)還有更多的東西, 需要自己去慢慢的理解體會(huì)多使用, 熟練了就好了, 對(duì)于其他的VFL語句的用法請(qǐng)參考附錄里面的詳細(xì)使用

附錄

  1. 符號(hào)含義

    |:   表示父視圖
    -:  表示距離
    V:  表示垂直
    H:  表示水平
    >=: 表示視圖間距欲虚、寬度和高度必須大于或等于某個(gè)值
        <= :表示視圖間距、寬度和高度必須小宇或等于某個(gè)值
        == :表示視圖間距植旧、寬度或者高度必須等于某個(gè)值
    @:  優(yōu)先級(jí) 最大為  1000
    
  2. 一般用法:

    |-[view]-|:                          視圖處在父視圖的左右邊緣內(nèi)
    |-[view]  :                              視圖處在父視圖的左邊緣
    |[view]   :                              視圖和父視圖左邊對(duì)齊
    V:[view(100.)]  :                        設(shè)置視圖的高度 
    H:[view(100.)]  :                        設(shè)置視圖的寬度
    |-30.0-[view]-30.0-|:                表示離父視圖 左右間距  30
    |-[view(view1)]-[view1]-| :              View和view1視圖寬度一樣耕姊,并且在父視圖內(nèi)
    V:|-padding-[imageView]->=0-[button]-padding| : 表示離父視圖的距離為Padding,這兩個(gè)視圖間距必須大于或等于0并且距離底部父視圖為padding。此時(shí)必須對(duì) metrics參數(shù)賦值eg.  metrics:@{@"topMargin":@100};
    
    [wideView(>=60@700)]  :視圖的寬度為至少為60 優(yōu)先級(jí)為700
    
    最后要注意, H可以忽略, 默認(rèn)為水平布局 , V必須要寫!!!
    

    ?

好了碼了半天終于大功告成, 希望此博客對(duì)你有幫助, 記得點(diǎn)贊哦~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拱绑,一起剝皮案震驚了整個(gè)濱河市艾蓝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌硬爆,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件擎鸠,死亡現(xiàn)場離奇詭異缀磕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)劣光,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門袜蚕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绢涡,你說我怎么就攤上這事牲剃。” “怎么了雄可?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵凿傅,是天一觀的道長缠犀。 經(jīng)常有香客問我,道長聪舒,這世上最難降的妖魔是什么辨液? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮箱残,結(jié)果婚禮上滔迈,老公的妹妹穿的比我還像新娘。我一直安慰自己被辑,他們只是感情好燎悍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盼理,像睡著了一般间涵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上榜揖,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音抗蠢,去河邊找鬼举哟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛迅矛,可吹牛的內(nèi)容都是我干的妨猩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼秽褒,長吁一口氣:“原來是場噩夢啊……” “哼壶硅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起销斟,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤庐椒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蚂踊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體约谈,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年犁钟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棱诱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涝动,死狀恐怖迈勋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情醋粟,我是刑警寧澤靡菇,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布重归,位于F島的核電站,受9級(jí)特大地震影響镰官,放射性物質(zhì)發(fā)生泄漏提前。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一泳唠、第九天 我趴在偏房一處隱蔽的房頂上張望狈网。 院中可真熱鬧,春花似錦笨腥、人聲如沸拓哺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽士鸥。三九已至,卻和暖如春谆级,著一層夾襖步出監(jiān)牢的瞬間烤礁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工肥照, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脚仔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓舆绎,卻偏偏與公主長得像鲤脏,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吕朵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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