vfl

Posted 爱上咖啡的唐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vfl相关的知识,希望对你有一定的参考价值。

说明

  • 苹果官方提供的autoLayout框架
  • 不能实现所有的关系描述(比如控件之间有倍数\比例关系时,无法实现)

单个控件

    [super viewDidLoad];
    UIView *blueView=[[UIView alloc]init];
    blueView.backgroundColor=[UIColor blueColor];
    //不要将autoresizingMask转为autolayout的约束
    blueView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:blueView];

    NSNumber *[email protected]20;
    //水平方向
    //水平方向距离左右边框20
    NSString *vfl=@"H:|-20-[abc]-margin-|";
    NSDictionary *[email protected]{@"abc":blueView};
    NSDictionary *mertics=NSDictionaryOfVariableBindings(margin);
    NSArray *constraints=[NSLayoutConstraint constraintsWithVisualFormat:vfl options:kNilOptions metrics:mertics views:views];
    [self.view addConstraints:constraints];

    //垂直方向
    //垂直方向距离顶部20,高度20
    NSString *vflV=@"V:|-20-[abc(20)]|";
    NSArray *constraintsV=[NSLayoutConstraint constraintsWithVisualFormat:vflV options:kNilOptions metrics:nil views:views];
    [self.view addConstraints:constraintsV];

说明:

  • H表示水平方向设置
  • V表示垂直方向设置
  • |代表边框
  • -表示间距
  • [abc(20)]
    • []表示里面是控件
    • abc(20)可以是随便起的名字
    • 20表示在垂直方向表示高度,水平表示宽度
  • NSDictionary *[email protected]{@"abc":blueView};表达式中abc表示blueView控件,即使key值使用blueView,这个也不能省略
  • NSDictionaryOfVariableBindings(margin);表示key值和变量名一样

多个控件

    [super viewDidLoad];
    UIView *blueView=[[UIView alloc]init];
    blueView.backgroundColor=[UIColor blueColor];
    //不要将autoresizingMask转为autolayout的约束
    blueView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:blueView];

    UIView *redView=[[UIView alloc]init];
    redView.backgroundColor=[UIColor redColor];
    //不要将autoresizingMask转为autolayout的约束
    redView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:redView];

    NSNumber *[email protected]20;
    //水平方向
    //水平方向距离左右边框20
    NSString *vfl=@"H:|-20-[blueView]-margin-[redView(==blueView)]-margin-|";
    NSDictionary *[email protected]{@"blueView":blueView,@"redView":redView};
    NSDictionary *mertics=NSDictionaryOfVariableBindings(margin);
    NSArray *constraints=[NSLayoutConstraint constraintsWithVisualFormat:vfl options:kNilOptions metrics:mertics views:views];
    [self.view addConstraints:constraints];

    //垂直方向
    //垂直方向距离顶部20,高度20
    NSString *vflV=@"V:|-[blueView(20)]-20-|";
    NSArray *constraintsV=[NSLayoutConstraint constraintsWithVisualFormat:vflV options:kNilOptions metrics:nil views:views];
    [self.view addConstraints:constraintsV];

    //添加红色控件垂直约束
    NSLayoutConstraint *redConstraint1=[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:blueView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0];
    NSLayoutConstraint *redConstraint2=[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:blueView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0];
    [self.view addConstraint:redConstraint1];
    [self.view addConstraint:redConstraint2];

说明:

  • 两个控件时,有时需要结合非框架代码(如添加红色垂直方向约束部分代码),否则不能实现
  • [redView(==blueView)]两个控件时,等于另一个控件的宽或者高时,前面的==不能省略
  • 添加红色控件垂直约束也可以去掉,不过水平约束要修改options如下
  • NSArray *constraints=[NSLayoutConstraint constraintsWithVisualFormat:vfl options:NSLayoutFormatAlignAllTop | NSLayoutFormatAlignAllBottom metrics:mertics views:views];

以上是关于vfl的主要内容,如果未能解决你的问题,请参考以下文章

Autolayout开发之VFL语句

代码加约束VFL语法的详细使用介绍(代替Autolayout进行布局,比Autolayout更简单明了,生动直观)

VFL语言

AutoLayout - VFL

iOS学习之VFL语言简介

vfl