VFL 語句
VFL 語句可以用來寫控件之間的自動布局晚岭,調(diào)用的方法
[NSLayoutConstraint constraintsWithVisualFormat: options: metrics: views:]
參數(shù)
Format: VFL語句
options: 枚舉參數(shù)殊橙,是一個布局方向的參數(shù)彻坛,默認寫0
metrics: 一個字典渔彰,在format中使用了動態(tài)數(shù)據(jù)备图,可以用它來尋找動態(tài)數(shù)據(jù)的值
比如: @"H:|-[button(==width)]-|
,表示這個button的寬度為width,而width的值就是字典里面對應的key為width的值媚狰,如果沒有找到這個值,app就會crash.
views: 這是所有vfl語句中使用到的view
上面的例子可以這樣寫:NSDictionaryOfVariableBindings(button)
如果你使用到了多個view阔拳,就可以這樣NSDictionaryOfVariableBindings(button,button1,button3...)
崭孤,這個名字也要跟參數(shù)format中的 一 一 對應,缺一不可.
規(guī)范:
一糊肠、"H" "V" 方向
不寫H/V就表示 橫向
"H" 表示橫向 橫向描述關(guān)系
"V" 表示縱向 縱向描述關(guān)系
二辨宠、"[]" 、"|" 货裹、"-" 嗤形、"()" 符號
"[]":表示View
"|":表示superView,用來確定View的上下左右關(guān)系
"-":表示一個間隔 (這個間隔如果是子控件和superView之間的間隔弧圆,那么就是20px赋兵,如果是同一級別的View之間的,那么就是8px)
"()":表示間隔或者控件的大小數(shù)值搔预,也可表示另一個View霹期,里面可以有 == >= <= > < 等大小關(guān)系
例子:
H:|-[_testView]-|
表示距離父視圖的左右兩邊都是20pxV:|-[_testView]-|
表示距離父視圖的上下兩邊都是20pxH:|[_testView]
表示和父控件的左邊界對其,右邊忽略|-[view1(view2)]
表示view1和view2的寬度相等H:|-(20)-[_testView(300)]
和H:|-(20)-[_testView(==300)]
一樣的效果拯田,_testView為300的寬度H:[_testView(300)]
_testView為300的寬度
三历造、@符號
@符號表示優(yōu)先級,如 V:|-50@750-[view(55)]
船庇,或者寫到metrics里面更好吭产。具體定義查看UILayoutPriority。有幾個固定的數(shù)值鸭轮。1000表示必須支持臣淤。
四、options
這個看具體需要窃爷,如果是豎排V布局邑蒋,可以添加NSLayoutFormatAlignAllLeft,讓他們左邊對齊吞鸭。
五塞颁、參數(shù) views
views中放置是的接下來要操作的視圖列表硫痰,直接使用 _變量 的方式,不要使用屬性腻窒,因為屬性得到的值可能不是一個變量滩字,而是一個計算結(jié)果造虏。
例如:
NSMutableDictionary *dicViews = [NSMutableDictionary dictionaryWithDictionary:NSDictionaryOfVariableBindings(_testView)];
六御吞、參數(shù) metrics
metrics參數(shù)是在VFL語句中的一些間隔或者大小的變量
NSMutableDictionary *metrics = [NSMutableDictionary dictionaryWithObjectsAndKeys:@(padding), @"padding", nil];
注意
在VFL語句中使用的視圖變量是使用 [_變量] 的方式,而不能使用[self.屬性]的方式漓藕,否則編譯會報錯
addConstraint(s)前陶珠,view應該已經(jīng)被addSubView上去了
不必給views寫frame
-
給必要的view關(guān)掉AutoresizeingMask自動布局,否則設置會無效
self.testView.translatesAutoresizingMaskIntoConstraints = NO;
UILabel換行要寫linebreakMode享钞,要寫numberOfLines
UILabel要想換行揍诽,一定要添加preferredMaxLayoutWidth。否則沒法初始化寬度栗竖。
七暑脆、代碼
self.testView = [[UIView alloc] init];
self.testView.backgroundColor = [UIColor redColor];
//關(guān)閉其自動布局
self.testView.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:self.testView];
CGFloat padding = 60.0f;
NSString *HVLCString = @"H:|[_testView]|";
NSString *VVLCString = @"V:|-(padding)-[_testView]-(padding)-|";
//在VLC里面涉及到的語句
NSMutableDictionary *dicViews = [NSMutableDictionary dictionaryWithDictionary:NSDictionaryOfVariableBindings(_testView)];
//在VLC里面涉及到的間隔大小
NSMutableDictionary *metrics = [NSMutableDictionary dictionaryWithObjectsAndKeys:@(padding), @"padding", nil];
NSArray *HConstraintArray = [NSLayoutConstraint constraintsWithVisualFormat:HVLCString options:NSLayoutFormatAlignAllLeft metrics:metrics views:dicViews];
NSArray *VConstraintArray = [NSLayoutConstraint constraintsWithVisualFormat:VVLCString options:NSLayoutFormatAlignAllLeft metrics:metrics views:dicViews];
[self.view addConstraints:HConstraintArray];
[self.view addConstraints:VConstraintArray];
//不能下面這樣寫,應該將其分開寫
//[self.view addConstraints:@[HConstraintArray, VConstraintArray]];