程式碼中的視覺格式語言基礎約束
HVFL 是一種旨在以簡單快速的方式約束 UI 元素的語言。通常,VFL 在 Interface Builder 中具有優於傳統 UI 自定義的優勢,因為它更具可讀性,可訪問性和緊湊性。
這是一個 VFL 的例子,其中三個 UIViews 從左到右約束,填充 superView.width
,aGradeView
"H:|[bgView][`aGradeView(40)`][`bGradeView(40)`]|"
有兩個軸可以將 UI 物件限制為水平和垂直。
VFL 的每一行始終以 H:
或 V:
開頭。如果兩者都不存在,則預設選項為 H:
繼續,我們有一個管道。|
這個符號或管道指的是超級檢視。如果你仔細看看上面的 VFL 程式碼片段,你會注意到其中兩個管道。
這表示超檢視的兩個水平端,外側左側和外側邊界。
接下來你會看到一些方括號,在第一組方括號內,我們有 bgView
。當我們有方括號時,它指的是一個 UI 元素,現在你可能想知道我們如何在名稱和實際 UI 元素之間建立連結,也許是一個出口?
我將在帖子的最後介紹。
如果你看看第二對方括號 [
aGradeView(50)]
,我們也有一些括號內的括號,當它存在時,它根據軸定義寬度/高度,在這種情況下,寬度為 50 畫素。
第一個方括號 [bgView]
沒有明確定義的寬度,這意味著它將儘可能地跨越。
好吧,這是基礎知識,更多是關於另一個例子中的高階內容。
例如:
// 1. create views
UIView *blueView = [[UIView alloc] init];
blueView.backgroundColor = [UIColor blueColor];
[self.view addSubview:blueView];
UIView *redView = [[UIView alloc] init];
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];
// 2. forbid Autoresizing
blueView.translatesAutoresizingMaskIntoConstraints = NO;
redView.translatesAutoresizingMaskIntoConstraints = NO;
// 3. make contraints
// horizontal
NSArray *blueH = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[blueView]-20-|" options:NSLayoutFormatAlignAllLeft metrics:nil views:@{@"blueView" : blueView}];
[self.view addConstraints:blueH];
// vertical
NSArray *blueVandRedV = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[blueView(50)]-20-[redView(==blueView)]" options:NSLayoutFormatAlignAllTrailing metrics:nil views:@{@"blueView" : blueView, @"redView" : redView}];
[self.view addConstraints:blueVandRedV];
NSLayoutConstraint *redW = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:blueView attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0];
[self.view addConstraint:redW];