天天看點

Autolayout限制的代碼實作方式-2(VFL)總結:

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架構,将在下一章中介紹。

繼續閱讀