[NSLayoutConstraint constraintWithItem:(id)item 指定约束右边的视图view1
attribute:(NSLayoutAttribute)attribute 属性
relatedBy:(NSLayoutRelation)relation 指定左右两边的视图的关系relation
toItem:(id)otherItem 指定约束右边的视图view2
attribute:(NSLayoutAttribute)otherAttribute 属性
multiplier:(CGFloat)multiplier 指定一个与view2属性相乘的乘数multiplier
constant:(CGFloat)constant] 指定一个与view2属性相加的浮点数constant
如果你想设置的约束里不需要第二个view,要将第四个参数设为nil,第五个参数设为NSLayoutAttributeNotAnAttribute
[NSLayoutConstraint constraintWithItem:view1
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:view2
attribute:NSLayoutAttributeRight
multiplier:1
constant:10]
view1的左侧,在,view2的右侧,再多10个点,的地方。
附视图的属性和关系的值:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
typedef NS_ENUM(NSInteger, NSLayoutRelation) { NSLayoutRelationLessThanOrEqual = -1, //小于等于 NSLayoutRelationEqual = 0, //等于 NSLayoutRelationGreaterThanOrEqual = 1, //大于等于 }; typedef NS_ENUM(NSInteger, NSLayoutAttribute) { NSLayoutAttributeLeft = 1, //左侧 NSLayoutAttributeRight, //右侧 NSLayoutAttributeTop, //上方 NSLayoutAttributeBottom, //下方 NSLayoutAttributeLeading, //首部 NSLayoutAttributeTrailing, //尾部 NSLayoutAttributeWidth, //宽度 NSLayoutAttributeHeight, //高度 NSLayoutAttributeCenterX, //X轴中心 NSLayoutAttributeCenterY, //Y轴中心 NSLayoutAttributeBaseline, //文本底标线 NSLayoutAttributeNotAnAttribute = 0 //没有属性 }; NSLayoutAttributeLeft /NSLayoutAttributeRight 和NSLayoutAttributeLeading /NSLayoutAttributeTrailing 的区别是left/right永远是指左右,而leading/trailing在某些从右至左习惯的地区会变成,leading是右边,trailing是左边。NSArray *constraintH = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(>=0)-[imageView]-[label]-(>=0)-|"
options:0
metrics:nil
views:viewsDictionary];
|
NSArray *constraintH =
[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(>=0)-[imageView]-[label]-(>=0)-|" 此参数为你的vfl语句
options:0 枚举参数,默认写0,具体跟据你所实现的需求去选择你想要的枚举
metrics:nil metrics:这里是一个字典,当在format中使用了动态数据比如上现这句:@"H:|-[button(==width)]-|",表示这个button的宽度为width,那么这个参数去哪里找呢?就是在这个字典里面找到key对就的值,如果没有找到这个值,app就会crash.
views:viewsDictionary]; 这是传所有你在vfl中使用到的view,
NSLayoutConstraint
+ (NSArray *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts
metrics:(NSDictionary *)metrics
views:(NSDictionary *)views;
NSDictionaryOfVariableBindings(button).如果你使用到了多个view,就可以这样NSDictionaryOfVariableBindings(button,button1,button3...),这个名字也要跟参数format中的一一对应,缺一不可.
2.UIView API
1
2
|
UIView - (void)addConstraints:(NSArray *)constraints; |
在上面1中返回值类型是NSArray,而现在这个方法的参数也刚好是一个NSArray类型。那么直接把上一个方法的返回值当作这个方法的参数就可以了。如果你有多个VFL,你也可以利用可变数组( NSMutableArray)把这多个VFL返回的数据拼在一起,然后再调用addConstraints:方法。
具体看代码
NSArray *constraints1=[NSLayoutConstraint constraintsWithVisualFormat:@
"H:|-[button]-|"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(button)];
这里的意思是:button在水平方向上距离它的superView,左右各20px,比如在这里他的大小就是320-20*2=280.在@"H:|-[button]-|"这个语句中,其中"H:"是表示这是水平方向上的约束,"|"是表示superView,"-"表示一个间隔空间,这个间隔如果是如superView之间的,那么就是20px,如果是两个同级别的view,比如@"[button]-[button1]",那么这里表示的是8px.
NSArray *constraints2=[NSLayoutConstraint constraintsWithVisualFormat:@
"V:|-20-[button(==30)]"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(button)];
跟上面有点不同,@"V:|-20-[button(==30)]",其中"V:"中代表这是垂直方向上的约束,"|-20-"这里的意思就是距离头部为20px,相当于y坐标为20。后面的"[button(==30)]",是指定这个button的高度为30px.y坐标固定了,高度固定了,那这个view的约束就完成了。如果你有需要,你的高度值(或者其他同类型的)可以使用>=,==,<=来表示,甚至你可以组合来用,像上面的30,你可以指定一个区别,比如:(>=30,<=40),这同样也是可以的。如果你想表达他的优先级别,可以使用@"V:|-20-[button(==30@1000)]",这个@1000,就是他的级别了。你可以适配XIB或者SB对它的优先级做更多的处理.
PS:值得注意的是,在用代码创建的UIView在,一定要加上下面这句代码
1
|
button.translatesAutoresizingMaskIntoConstraints=NO; |
如果没有上面这一行,你的约束将不生效,控制台会输出一连串的错误.
如果这样的话就是等等宽等高了
NSArray *constraints3=[NSLayoutConstraint constraintsWithVisualFormat:@
"H:|-[button1(button)]"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(button1,button)];
NSArray *constraints4=[NSLayoutConstraint constraintsWithVisualFormat:@
"V:[button]-[button1(button)]"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(button1,button)];
三:最后对格式的字符串作一个总结介绍
功能 表达式
水平方向 H:
垂直方向 V:
Views [view]
SuperView |
关系 >=,==,<=
空间,间隙 -
优先级 @value