Visual format language

所谓的VFL语言其实就是Visual format language 的缩写,是一种使用代码添加约束的方式,类似于Masonry  SDAutolayout的效果,但是操作起来可能要相对简单。一行代码就可以实现。

  举一个例子:

UIView *ive1=[UIView new];

ive1.translatesAutoresizingMaskIntoConstraints=NO;

ive1.backgroundColor=[UIColor redColor];

[self.view addSubview:ive1];

UIView *ive2=[UIView new];

ive2.translatesAutoresizingMaskIntoConstraints=NO;

ive2.backgroundColor=[UIColor blueColor];

[self.view addSubview:ive2];

  因为要使用VFL语言,所以就不需要指定固定的frame,但是需要注意的是控件必须先添加到视图上去。

  

NSArray *ive1Arr= [NSLayoutConstraint

                   

                   constraintsWithVisualFormat:@"H:|-20-[ive1]-20-|" //这个是水平方向的约束,'|'表示父视图

                   options:NSLayoutFormatAlignAllTop|NSLayoutFormatAlignAllBottom //这是个对齐方式

                   metrics:nil//这里返回的是一个字典,意思是将约束中的某些值用字符串来代替,字典中给多对应的字符串赋值,方便修改

                   views:NSDictionaryOfVariableBindings(blueView)];//跟上边相似,返回字典,可用字符串代替,然后给出名字。

//上边的式子等同于

NSArray *ive1Arr =[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-toLeft-[testView]-20-|"options:NSLayoutFormatAlignAllTop|NSLayoutFormatAlignAllBottom metrics:@{@"toLeft":@20} views:@{@"testView":ive1}];

[self.view addConstraints:ive1Arr];//给添加水平方向的约束数组

//给添加垂直方向的数组,高度为五十,距离底边距为10 这种写法会简单一些

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[ive1(50)]-10-|"

                                                                  options:NSLayoutFormatDirectionLeadingToTrailing

                                                                  metrics:nil

                                                                    views:NSDictionaryOfVariableBindings(ive1)]];

注意一个问题,Visual format language 语言里不能出现乘除法,否则会崩溃。这种情况下只能使用另外一个方法

举例(ive1的宽度是ive2宽度的一半):

NSLayoutConstraint *constraintIve1=[NSLayoutConstraint

                                    constraintWithItem:ive1       //目标item

                                    attribute:NSLayoutAttributeWidth //约束类型

                                    relateBy:NSLayoutRelationEqual  //等同于

                                    toItem:ive2             //对比item

                                    attribute:NSLayoutAttributeWidth

                                    multiplier:0.5           //对比的倍数

                                    constant:0.0            //获取到响应的倍数以后增加固定量

                                    ];

上边内容为手打字母,直接copy可能会有字符错误。请理解代码意思以后自行书写。

原文地址:https://www.cnblogs.com/huketianxia/p/5121806.html