VFL是蘋果官方推出的一種改善純代碼實作限制的文法糖
下面是一個例子:
// 藍色控件
UIView *blueView = [[UIViewalloc] init];
blueView.backgroundColor = [UIColorblueColor];
blueView.translatesAutoresizingMaskIntoConstraints =NO;
[self.viewaddSubview:blueView];
//水準限制
NSString *vfl =@"H:|-margin-[blueView]-margin-|";
NSNumber *margin =@20;
NSDictionary *metric =NSDictionaryOfVariableBindings(margin);
NSDictionary *views =NSDictionaryOfVariableBindings(blueView);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:vfl
options:NSLayoutFormatAlignAllTop | NSLayoutFormatAlignAllBottom
metrics:metric v
news:views ];
[self.viewaddConstraints:constraints];
// 垂直限制
NSString *vfl2 =@"V:|-margin-[blueView(height)]";
NSNumber *height =@40;
NSDictionary *metric2 =NSDictionaryOfVariableBindings(margin, height);
NSArray *constraints2 = [NSLayoutConstraint constraintsWithVisualFormat:vfl2
options:kNilOptions
metrics:metric2
views:views ];
[self.viewaddConstraints:constraints2];
參數解讀:
* vfl表示限制的文法
* "H"代表Horizontal,表示水準方向
* margin是自定義的間距
* 中間的blueView則代表被設定限制的控件
* NSDictionaryOfVariableBindings方法可以快速定義出字典類執行個體。
* NSLayoutConstraint constraintsWithVisualFormat 方法中,參數vol表示限制的文法;metric表示除了被設定限制的控件本身的其他限制參數字典集合;views表示被設定限制的控件字典集合
* options這個參數表示水準或者垂直方向上的所有控件是不是上下對齊、居中對齊或者左右對齊等
總結:
VFL形式設定的限制比起純代碼設定的限制會優雅一些,但并不是非常優雅,并且有些功能無法實作,還需要與純代碼方式結合才能完成特定的限制規則,比如兩個控件并排在父控件的最下方,兩個的寬度和高度完全一樣,與父控件和彼此的間距也一樣,通過VFL的話:
A控件水準方向的設定: NSString *vfl = @"H:|-margin-[blueView]-margin-[redView(==blueView)]-margin-|";
A控件垂直方向的設定: NSString *vfl2 = @"V:[blueView(height)]-margin-|" ;
與此同時無法同時設定B控件的寬高與A控件一緻,是以還需另外設定純代碼限制:
NSLayoutConstraint *限制1 = [NSLayoutConstraint constraintWithItem:B控件
attribute:NSLayoutAttributeTop(頂部)
relatedBy:NSLayoutRelationEqual(等于)
toItem:A控件
attribute:NSLayoutAttributeTop(頂部)
multiplier:1.0(乘數)
constant:0(加數) ];
NSLayoutConstraint *限制2 = [NSLayoutConstraint constraintWithItem:B控件
attribute:NSLayoutAttributeBottom(底部)
relatedBy:NSLayoutRelationEqual(等于)
toItem:A控件
attribute:NSLayoutAttributeBottom(底部)
multiplier:1.0(乘數)
constant:0(加數) ];
這樣才能完整的設定B控件與A控件的一緻的限制,是以如果要代碼實作的話最好還是使用第三方的架構,比如Masonry架構,将在下一章中介紹。