所谓的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可能会有字符错误。请理解代码意思以后自行书写。