VFL的簡單使用教程

因為工作原因,需要用到VFL卷玉,所以在放假期間不得不研究一下VFL的使用,很多地方仍然不熟悉喷市,在次記錄下使用方法相种。

VFL基本語法介紹

功能        表達式

水平方向        H:

垂直方向        V:

Views         [view]

SuperView      |

關系         >=,==,<=

空間,間隙(默認值8)   -

優(yōu)先級        @value

舉例示范

語法示例 圖片展示 語法介紹
H:[button]-[textField]
standard Space
設置視圖間距
H:[button(>=50)]
Width Constraint
設置寬度大于等于50
H:-50-[purpleBox]-50-
connectionToSuperView
距父視圖左右邊距50
V:[topField-10-[bottomField]]
VerticalLayout
豎直方向設置間距
H:[maroonView][blueView]
對齊
H:[button(@200)]
設置優(yōu)先級
H:[button1(==button2)]
等寬
[flexibleButton(>=70,<=100)]
多個謂語設置尺寸

第三句的語法,應為"H:|-50-[purpleBox]-50-|",因為與MarkDown表格語法沖突品姓,所以無法顯示"|",在此處更正下.

VFL API

NSLayoutConstraint
+ (NSArray *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary *)metrics views:(NSDictionary *)views;

參數介紹:

format:此參數就是我們需要設置的VFL語句寝并,如 "|H:-50-[purpleBox]-50-|"

options:枚舉參數,默認寫0腹备,具體跟你你所實現的需求去選擇你想要的枚舉衬潦。

metrics:這里是一個字典,當在format中使用了動態(tài)數據比如上現這句:@"H:|-[button(==width)]-|",表示這個button的寬度為width,那么這個參數去哪里找呢植酥?就是在這個字典里面找到key對就的值镀岛,如果沒有找到這個值,app就會crash.

views:顧名思義友驮,這是傳所有你在vfl中使用到的view漂羊,那在上面這句例子中的應該怎么傳呢?結果是這樣的:NSDictionaryOfVariableBindings(button).如果你使用到了多個view喊儡,就可以這樣NSDictionaryOfVariableBindings(button,button1,button3...),這個名字也要跟參數format中的一一對應拨与,缺一不可.

NSLayoutConstraint
+(instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;

參數介紹:

view1:需要添加約束的view

attr1:枚舉稻据,添加約束對應的屬性艾猜,例如:NSLayoutAttributeLeft;

relation:枚舉捻悯,添加約束與關聯的view之間的關系匆赃,關系有 ==, >= ,<=

view2:添加約束需要關聯的view

attr2:關聯的view對應的屬性

multiplier:與關聯view對應屬性的倍數關系

constraint:約束值

UIView API

UIView
- (void)addConstraints:(NSArray *)constraints;

在VFL的第一個API中返回值類型是NSArray,而現在這個方法的參數也剛好是一個NSArray類型今缚。那么直接把上一個方法的返回值當作這個方法的參數就可以了算柳。如果你有多個VFL,你也可以利用可變數組( NSMutableArray)把這多個VFL返回的數據拼在一起姓言,然后再調用addConstraints:方法瞬项。

UIView
- (void)addConstraint:(NSLayoutConstraint *)constraint;

在VFL的第二個API中返回值類型是NSLayoutConstraint蔗蹋,現在這個方法的參數也是NSLayoutConstraint。那么直接把上一個方法的返回值當作這個方法的參數就可以了囱淋。

代碼示例

現在我們有一個需求猪杭,頁面中有一張圖片和一段文字,我們需要圖片距離父視圖左邊和上邊各20妥衣,寬高固定為80皂吮,文字距圖片下方20,父視圖左邊20税手,寬高根據文本內容變化蜂筹。
如下圖:

根據以上的需求,實現代碼如下:

//初始化ImageView
UIImageView *imageView = [UIImageView new];
imageView.image = [UIImage imageNamed:@"2.jpg"];
imageView.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:imageView];

//初始化Label
UILabel *label = [UILabel new];
label.translatesAutoresizingMaskIntoConstraints = NO;
label.text = @"這是一個優(yōu)美的句子芦倒。";
[self.view addSubview:label];

//imageView的約束設置
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(imageView);

NSArray *imageViewHorizontalContriants = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[imageView(==80)]" options:0 metrics:nil views:viewsDictionary];
[self.view addConstraints:imageViewHorizontalContriants];

NSArray *imageViewVerticalContriants = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[imageView(==80)]" options:0 metrics:nil views:viewsDictionary];
[self.view addConstraints:imageViewVerticalContriants];

//label的約束設置
NSArray *labelHorizontalContraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[label]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label)];
[self.view addConstraints:labelHorizontalContraints];

NSArray *labelVerticalContraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[imageView]-20-[label]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(imageView,label)];
[self.view addConstraints:labelVerticalContraints];

現在我們的需求改變一下艺挪,我們需要圖片和文字居中對齊。

這樣的話熙暴,我們可以把約束代碼更新如下:

NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(imageView);

NSArray *imageViewHorizontalContriants = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[imageView(==80)]" options:0 metrics:nil views:viewsDictionary];
[self.view addConstraints:imageViewHorizontalContriants];

NSArray *imageViewVerticalContriants = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[imageView(==80)]" options:0 metrics:nil views:viewsDictionary];
[self.view addConstraints:imageViewVerticalContriants];

NSLayoutConstraint *imageViewConstraint = [NSLayoutConstraint constraintWithItem:imageView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];
[self.view addConstraint:imageViewConstraint];


NSArray *labelVerticalContraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[imageView]-20-[label]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(imageView,label)];
[self.view addConstraints:labelVerticalContraints];

NSLayoutConstraint *labelConstraint = [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];
[self.view addConstraint:labelConstraint];

下面把需求難度提升一下闺属,我們需要文字可以自動換行,而且距父視圖大于等于10周霉。
添加label的約束代碼如下:

label.numberOfLines = 0;
NSArray *labelHorizantalContraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|->=10-[label]->=10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label)];
[self.view addConstraints:labelHorizantalContraints];
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末掂器,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子俱箱,更是在濱河造成了極大的恐慌国瓮,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狞谱,死亡現場離奇詭異乃摹,居然都是意外死亡,警方通過查閱死者的電腦和手機跟衅,發(fā)現死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門孵睬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伶跷,你說我怎么就攤上這事掰读。” “怎么了叭莫?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵蹈集,是天一觀的道長。 經常有香客問我雇初,道長拢肆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮郭怪,結果婚禮上支示,老公的妹妹穿的比我還像新娘。我一直安慰自己鄙才,他們只是感情好悼院,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咒循,像睡著了一般据途。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叙甸,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天颖医,我揣著相機與錄音,去河邊找鬼裆蒸。 笑死熔萧,一個胖子當著我的面吹牛,可吹牛的內容都是我干的僚祷。 我是一名探鬼主播佛致,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辙谜!你這毒婦竟也來了俺榆?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤装哆,失蹤者是張志新(化名)和其女友劉穎罐脊,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體蜕琴,經...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡萍桌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了凌简。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片上炎。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖雏搂,靈堂內的尸體忽然破棺而出藕施,到底是詐尸還是另有隱情,我是刑警寧澤畔派,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布铅碍,位于F島的核電站润绵,受9級特大地震影響线椰,放射性物質發(fā)生泄漏。R本人自食惡果不足惜尘盼,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一憨愉、第九天 我趴在偏房一處隱蔽的房頂上張望烦绳。 院中可真熱鬧,春花似錦配紫、人聲如沸径密。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽享扔。三九已至,卻和暖如春植袍,著一層夾襖步出監(jiān)牢的瞬間惧眠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工于个, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留氛魁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓厅篓,卻偏偏與公主長得像秀存,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子羽氮,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容