VFL 语句
VFL 语句
VFL 语句可以用来写控件之间的自动布局,调用的方法
[NSLayoutConstraint constraintsWithVisualFormat: options: metrics: views:]
参数
Format: VFL语句
options: 枚举参数,是一个布局方向的参数,默认写0
metrics: 一个字典,在format中使用了动态数据,可以用它来寻找动态数据的值
比如: @"H:|-[button(==width)]-|
,表示这个button的宽度为width,而width的值就是字典里面对应的key为width的值,如果没有找到这个值,app就会crash.
views: 这是所有vfl语句中使用到的view
上面的例子可以这样写:NSDictionaryOfVariableBindings(button)
如果你使用到了多个view,就可以这样NSDictionaryOfVariableBindings(button,button1,button3...)
,这个名字也要跟参数format中的 一 一 对应,缺一不可.
规范:
一、"H" "V" 方向
不写H/V就表示 横向
"H" 表示横向 横向描述关系
"V" 表示纵向 纵向描述关系
二、"[]" 、"|" 、"-" 、"()" 符号
"[]":表示View
"|":表示superView,用来确定View的上下左右关系
"-":表示一个间隔 (这个间隔如果是子控件和superView之间的间隔,那么就是20px,如果是同一级别的View之间的,那么就是8px)
"()":表示间隔或者控件的大小数值,也可表示另一个View,里面可以有 == >= <= > < 等大小关系
例子:
-
H:|-[_testView]-|
表示距离父视图的左右两边都是20px -
V:|-[_testView]-|
表示距离父视图的上下两边都是20px -
H:|[_testView]
表示和父控件的左边界对其,右边忽略 -
|-[view1(view2)]
表示view1和view2的宽度相等 -
H:|-(20)-[_testView(300)]
和H:|-(20)-[_testView(==300)]
一样的效果,_testView为300的宽度 -
H:[_testView(300)]
_testView为300的宽度
三、@符号
@符号表示优先级,如 V:|-50@750-[view(55)]
,或者写到metrics里面更好。具体定义查看UILayoutPriority。有几个固定的数值。1000表示必须支持。
四、options
这个看具体需要,如果是竖排V布局,可以添加NSLayoutFormatAlignAllLeft,让他们左边对齐。
五、参数 views
views中放置是的接下来要操作的视图列表,直接使用 _变量 的方式,不要使用属性,因为属性得到的值可能不是一个变量,而是一个计算结果。
例如:
NSMutableDictionary *dicViews = [NSMutableDictionary dictionaryWithDictionary:NSDictionaryOfVariableBindings(_testView)];
六、参数 metrics
metrics参数是在VFL语句中的一些间隔或者大小的变量
NSMutableDictionary *metrics = [NSMutableDictionary dictionaryWithObjectsAndKeys:@(padding), @"padding", nil];
注意
-
在VFL语句中使用的视图变量是使用 [_变量] 的方式,而不能使用[self.属性]的方式,否则编译会报错
-
addConstraint(s)前,view应该已经被addSubView上去了
-
不必给views写frame
-
给必要的view关掉AutoresizeingMask自动布局,否则设置会无效
self.testView.translatesAutoresizingMaskIntoConstraints = NO;
-
UILabel换行要写linebreakMode,要写numberOfLines
-
UILabel要想换行,一定要添加preferredMaxLayoutWidth。否则没法初始化宽度。
七、代码
self.testView = [[UIView alloc] init];
self.testView.backgroundColor = [UIColor redColor];
//关闭其自动布局
self.testView.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:self.testView];
CGFloat padding = 60.0f;
NSString *HVLCString = @"H:|[_testView]|";
NSString *VVLCString = @"V:|-(padding)-[_testView]-(padding)-|";
//在VLC里面涉及到的语句
NSMutableDictionary *dicViews = [NSMutableDictionary dictionaryWithDictionary:NSDictionaryOfVariableBindings(_testView)];
//在VLC里面涉及到的间隔大小
NSMutableDictionary *metrics = [NSMutableDictionary dictionaryWithObjectsAndKeys:@(padding), @"padding", nil];
NSArray *HConstraintArray = [NSLayoutConstraint constraintsWithVisualFormat:HVLCString options:NSLayoutFormatAlignAllLeft metrics:metrics views:dicViews];
NSArray *VConstraintArray = [NSLayoutConstraint constraintsWithVisualFormat:VVLCString options:NSLayoutFormatAlignAllLeft metrics:metrics views:dicViews];
[self.view addConstraints:HConstraintArray];
[self.view addConstraints:VConstraintArray];
//不能下面这样写,应该将其分开写
//[self.view addConstraints:@[HConstraintArray, VConstraintArray]];