一、VFL语言简洁

  • VFL(Visual format language)语言是苹果为了简化手写Autolayout代码所创建的专门负责编写约束的代码。为我们简化了许多代码量。

二、使用步骤

使用步骤同手动添加约束保持一致

  • 创建控件
  • 添加到父控件
  • 禁用Aoturesizing
  • 添加约束

三、使用方法

  • 这里先展示一个实例:
NSArray *blueHArr = [NSLayoutConstraint constraintsWithVisualFormat:
@"H:|-20-[blueView]-20-|"
options:kNilOptions
metrics:nil views:
NSDictionaryOfVariableBindings(blueView)];
  • 方法介绍:

    • constraintsWithVisualFormat:这个方法返回了一个数组;
    • @"H:|-20-[blueView(100)]-20-|":这句话表明所添加的约束,H的意思是水平方向添加约束,blueView 视图名称,(100)代表着blueView 的宽为100blueView距离父类的左边20,距离父类的右边是20;
    • options:是对其方式;
    • metrics:返回的是一个字典,它的意思是可以将约束中的值用某些字符串来代理,然后在这个字典中给多对应的字符串赋值,方便修改,并且增加可读性;
    • views:返回的也是一个字典,这个字典的意思是:你可以将前面的view用其他字符串来代替,在这里在给他赋给对应的view的名字。
  • 我可以将上面的约束语句改成如下这样:
    NSArray *blueHArr = [NSLayoutConstraint
    constraintsWithVisualFormat:@"H:|-aa-[cccc(100)]-20-|"
    options:kNilOptions
    metrics:@{@"aa":@20}
    views:@{@"cccc":blueView}];
    • 这里我用aa替换了20,cccc替换了blueVuew
    • 这里有一个简单的方法,就是使用NSDictionaryOfVariableBindings(blueView)来替换views中的内容也是可以的。

四、VFL的缺点

  • VFL语句不支持乘除法
  • 比如我想表示redview是blueview高度的一半,
    我们是不能这样写的:
    NSArray *redVArr = [NSLayoutConstraint
    constraintsWithVisualFormat:@"V:[blueView]-20-[redView(==blueView*0.5)]"
    options:NSLayoutFormatAlignAllRight
    metrics:nil
    views:NSDictionaryOfVariableBindings(blueView, redView)];

    原因就是这里包含了乘法,而一旦VFL语句中包含了乘除法那么系统就会不识别而崩溃。

  • 所以,当一涉及到乘除法的时候,我们又不得不再次使用系统原来的方法中来:
    NSLayoutConstraint *redWidth = [NSLayoutConstraint
    constraintWithItem:redView
    attribute:NSLayoutAttributeWidth
    relatedBy:NSLayoutRelationEqual
    toItem:blueView
    attribute:NSLayoutAttributeWidth
    multiplier:0.5
    constant:0.0];

五、总结

  • 苹果虽然推出了这项简单的语言,简化了代码量,也方便了我们用代码来书写约束。
  • 但是VFL的缺陷也是很明显的,不支持乘除法的的弊端让它的应用也是大打折扣。

六、示例解释

NSDictionary *views = NSDictionaryOfVariableBindings(_cameraView, _cancelButton);

[self.view addConstraints:

[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_cameraView][_cancelButton(40)]|" options:0 metrics:nil views:views]];

[self.view addConstraints:

[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_cameraView]|" options:0 metrics:nil views:views]];

[self.view addConstraints:

[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_cancelButton]-|" options:0 metrics:nil views:views]];

if (_switchCameraButton) {

NSDictionary *switchViews = NSDictionaryOfVariableBindings(_switchCameraButton);

[self.view addConstraints:

[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_switchCameraButton(50)]" options:0 metrics:nil views:switchViews]];

// V:|[_switchCameraButton(50)]  中 '|'表示距离top,没有值则表示距离top距离为0;(50)表示控件_switchCameraButton的高度为50

[self.view addConstraints:

[NSLayoutConstraint constraintsWithVisualFormat:@"H:[_switchCameraButton(70)]|" options:0 metrics:nil views:switchViews]];

}

最新文章

  1. 解决 Could not find com.android.tools.build:gradle 问题
  2. 一言不合就动手系列篇一-仿电商平台前端搜索插件(filterMore)
  3. linux之sed用法
  4. 无环的visitor模式
  5. CodeForces 670D2 Magic Powder 二分
  6. spring mvc获取request HttpServletRequest
  7. ps命令详解(转)
  8. js json与对象的相互转换
  9. POJ 1755 Triathlon [半平面交 线性规划]
  10. iOS调用系统发送短信和邮件分享
  11. 解读JavaScript 之引擎、运行时和堆栈调用
  12. 使用log4j记录日志
  13. Python创建virtualenv(虚拟环境)方法
  14. java基础 (三)之ConcurrentHashMap(转)
  15. AI 学习
  16. day22 面向对象基础
  17. 谈谈Linux内核驱动的coding style【转】
  18. C++初始化列表和大括号中构造的差别
  19. maven内部运行原理解析(一)
  20. Mybatis三剑客之mybatis-plugin

热门文章

  1. 闲谈--心态 (zhuan)
  2. Eclipse启动tomcat时报错:Multiple Contexts have a path of "/xxx"
  3. iOS开发 自定义窗口 以及 点击scrollView置顶
  4. (x&y) + ((x^y)>>1)即x和y的算数平均值
  5. 国内外做MySQL的公司
  6. ajax 动态获取json的例子
  7. Java虚拟机类加载机制——案例分析
  8. Runner站立会议之个人记录
  9. HDFS使用0
  10. Java初学之华容道游戏