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,里面可以有 == >= <= > < 等大小关系

例子:

  1. H:|-[_testView]-| 表示距离父视图的左右两边都是20px

  2. V:|-[_testView]-| 表示距离父视图的上下两边都是20px

  3. H:|[_testView] 表示和父控件的左边界对其,右边忽略

  4. |-[view1(view2)] 表示view1和view2的宽度相等

  5. H:|-(20)-[_testView(300)]H:|-(20)-[_testView(==300)] 一样的效果,_testView为300的宽度

  6. 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];

注意

  1. 在VFL语句中使用的视图变量是使用 [_变量] 的方式,而不能使用[self.属性]的方式,否则编译会报错

  2. addConstraint(s)前,view应该已经被addSubView上去了

  3. 不必给views写frame

  4. 给必要的view关掉AutoresizeingMask自动布局,否则设置会无效

    self.testView.translatesAutoresizingMaskIntoConstraints = NO;

  5. UILabel换行要写linebreakMode,要写numberOfLines

  6. 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]];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值