iOS:VFL语言

VFL语言

介绍:

什么是VFL语言?

VFL全称是Visual Format Language,翻译过来是“可视化格式语言”

VFL是苹果公司为了简化Autolayout的编码而推出的抽象语言

VFL示例:

H:[cancelButton(72)]-12-[acceptButton(50)]

cancelButton宽72,acceptButton宽50,它们之间间距12

H:[wideView(>[email protected])]

wideView宽度大于等于60point,该约束条件优先级为700(优先级最大值为1000,优先级越高的约束越先被满足)

V:[redBox]-[yellowBox(==redBox)]

竖直方向上,先有一个redBox,其下方紧接一个高度等于redBox高度的yellowBox

H:|-10-[Find]-[FindNext]-[FindField(>=20)]-|

水平方向上,Find距离父view左边缘默认间隔宽度,之后是FindNext距离Find间隔默认宽度;再之后是宽度不小于20的FindField,它和FindNext以及父view右边缘的间距都是默认宽度。(竖线“|” 表示superview的边缘)

VFL的使用:

使用VFL来创建约束数组

+ (NSArray *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary *)metrics views:(NSDictionary *)views;

format :VFL语句

opts :约束类型

metrics :VFL语句中用到的具体数值

views :VFL语句中用到的控件

创建一个字典(内部包含VFL语句中用到的控件)的快捷宏定义

NSDictionaryOfVariableBindings(...)

具体实例如下:

练习一:

在控制器view底部添加2个view,1个蓝色,1个红色

2个view宽度、高度永远相等

距离父控件左边、右边、下边间距和2个view之间的间距相等

在ViewController.m文件的-(void)viewDidLoad{........}方法中代码如下:

//创建两个视图view1和view2,view1为蓝色,view2为红色

    //创建view1
    UIView *view1 = [[UIView alloc]init];
    view1.backgroundColor = [UIColor blueColor];
    view1.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:view1];

    //创建view2
    UIView *view2 = [[UIView alloc]init];
    view2.backgroundColor = [UIColor redColor];
    view2.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:view2];

//使用VFL语言生成view1、view2的约束

    //使用VFL语言生成约束
    NSDictionary *metrics = @{@"margin":@20,@"height":@200};

    //NSDictionary *views = @{@"view1":view1,@"view2":view2}; //作用与下面的字典一样
    NSDictionary *views = NSDictionaryOfVariableBindings(view1,view2);
    //获取view1、view2水平方向上的约束
    NSArray *conts = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-margin-[view1]-margin-[view2(==view1)]-margin-|" options:0 metrics:metrics views:views];
        //获取view1竖直方向的约束
    NSArray *conts2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[view1(height)]-margin-|" options:0 metrics:metrics views:views];
    //获取view2竖直方向上的约束
    NSArray *conts3 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[view2(==view1)]-margin-|" options:0 metrics:metrics views:views];

//将生成的约束添加到它们的父视图中

    //在父视图上添加VFL语言生成的约束
    [self.view addConstraints:conts];
    [self.view addConstraints:conts2];
    [self.view addConstraints:conts3];

旋转屏幕的演示结果为:

 

练习二:

在控制器view顶部添加2个view,1个蓝色,1个红色

2个view高度永远相等

红色view和蓝色view右边对齐

蓝色view距离父控件左边、右边、上边间距相等

蓝色view距离红色view间距固定

红色view的左边和父控件的中点对齐

分析:虽然VFL语言简化了AutoLayout布局的代码量,但是它也有一个缺陷,那就是它无法生成视图与中心点处的约束,此时,需要再搭配AutoLayout的代码,才能完成这个需求。才上面的题可以看出,对view2需要使用

在ViewController.m文件的-(void)viewDidLoad{........}方法中代码如下:

创建视图view1和view2

    //创建view1
    UIView *view1 = [[UIView alloc]init];
    view1.backgroundColor = [UIColor blueColor];
    view1.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:view1];

    //创建view2
    UIView *view2 = [[UIView alloc]init];
    view2.backgroundColor = [UIColor redColor];
    view2.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:view2];

使用VFL语言生成view1水平方向的约束、view1和view2竖直方向的约束

    //使用VFL语言生成view1的约束
    NSDictionary *metrics = @{@"height":@100,@"margin":@20};
    NSDictionary *views = NSDictionaryOfVariableBindings(view1,view2);
        //获取水平方向上view1的约束
    NSArray *constr = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-margin-[view1]-margin-|" options:0 metrics:metrics views:views];

    //获取竖直方向上view1和view2的约束
    NSArray *constr2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-margin-[view1(height)]-margin-[view2(==view1)]" options:0 metrics:metrics views:views];

使用Autolayout创建view2的约束

    #pargma mark -使用Autolayout给view2创建约束

    //创建view2右边与父视图右边的约束
    NSLayoutConstraint *lcRight = [NSLayoutConstraint constraintWithItem:view2 attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:-20];
    //创建view2左边与父视图中心处的约束
    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:view2 attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0];

添加约束

    //将AutoLayout创建的约束添加到父视图中
    [self.view addConstraints:@[lcRight,constraint]];

    //将VFL生成的约束添加到父视图中
    [self.view addConstraints:constr];
    [self.view addConstraints:constr2];

旋转屏幕的演示结果如下:

 

时间: 2024-12-13 14:33:17

iOS:VFL语言的相关文章

iOS学习之VFL语言简介

http://www.cnblogs.com/chars/p/5146607.html 什么是VFL语言 VFL(Visual Format Language),"可视化格式语言". VFL是苹果公司为了简化autolayout的编码而推出的抽象语言. 语法说明 H:[cancelButton(72)]-12-[acceptButton(50)] cancelButton宽72,acceptButton宽50,它们之间间距12 H:[wideView(>[email protec

iOS UI布局-VFL语言

什么是VFL语言 VFL(Visual Format Language),“可视化格式语言”. VFL是苹果公司为了简化autolayout的编码而推出的抽象语言. 语法说明 H:[cancelButton(72)]-12-[acceptButton(50)] cancelButton宽72,acceptButton宽50,它们之间间距12 H:[wideView(>=60@700)] wideView宽度大于等于60point,该约束条件优先级为700(优先级最大值为1000,优先级越高的约束

iOS,自动布局autoresizing和auto layout,VFL语言

1.使用autoresizing 2.使用autolayout 3.VFL语言(Visual Format Language:可视化格式语言) 使用autoresizing 点击xib文件,去掉使用autolayout(autolayout和只能使用一个)    如图中所示 1.代表视图距离父容器顶部距离固定 2.代表视图距离父容器左边距离固定 3.代表视图距离父容器底部距离固定 4.代表视图距离父容器右边距离固定 5.中间水平线表示视图随着父容器变宽而变宽(按比例) 6.中间垂直线表示视图随着

Autolayout屏幕适配——代码实现(苹果公司 / VFL语言 / 第三方框架Masonry)

在讲解如何通过代码来实现屏幕适配前,先来了解一下,屏幕适配中用到的约束添加的规则. 在创建约束之后,需要将其添加到作用的view上 在添加时要注意目标view需要遵循以下规则: 1. 约束规则    1> 添加约束的规则(一) 对于两个同层级view之间的约束关系,添加到它们的父view上 2> 添加约束的规则(二) 对于两个不同层级view之间的约束关系,添加到他们最近的共同父view上 3> 添加约束的规则(三) 对于有层次关系的两个view之间的约束关系,添加到层次较高的父view

IOS开发语言Swift入门连载---可选链

IOS开发语言Swift入门连载-可选链 可选链(Optional Chaining) 是一种可以请求和调用属性.方法及下标脚本的过程,它的可选性体现于请求或调用的目标当前可能为空(nil ).如果可选的目标有值,那么调用就会成功:相反,如果选择的目标为空(nil ),则这种调用将返回空(nil ).多次请求或调用可以被链接在一起形成一个链,如果任何一个节点为空(nil )将导致整个链失效. 注意: 的可选链和 Objective-C 中的消息为空有些相像,但是 Swift 可以使用在任意类型中

IOS开发语言Swift入门连载---类型转换

IOS开发语言Swift入门连载-类型转换 类型转换可以判断实例的类型,也可以将实例看做是其父类或者子类的实例. 类型转换在 Swift 中使用is 和 as 操作符实现.这两个操作符提供了一种简单达意的方式去检查值的类型或者转换它的类型. 你也可以用来检查一个类是否实现了某个协议,就像在 Checking for Protocol Conformance部分讲述的一样. 定义一个类层次作为例子 你可以将它用在类和子类的层次结构上,检查特定类实例的类型并且转换这个类实例的类型成为这个层次结构中的

VFL语言

什么是VFL语言 VFL全称是Visual Format Language,翻译过来是“可视化格式语言”VFL是苹果公司为了简化Autolayout的编码而推出的抽象语言 VFL示例 H:[cancelButton(72)]-12-[acceptButton(50)]canelButton宽72,acceptButton宽50,它们之间间距12 H:[wideView(>[email protected])]wideView宽度大于等于60point,该约束条件优先级为700(优先级最大值为10

IOS开发语言Swift入门连载---类和结构体

IOS开发语言Swift入门连载-类和结构体 类和结构体是人们构建代码所用的一种通用且灵活的构造体.为了在类和结构体中实现各种功能,我们必须要严格按照常量.变量以及函数所规定的语法规则来定义属性和添加方法. 与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意: 通常一个类 的实例被称为对象 .然而在Swift 中,类和结构体的关系要比在其他语言中更加的密切,本

IOS开发语言Swift入门连载---属性

IOS开发语言Swift入门连载-属性 属性将值跟特定的类.结构或枚举关联.存储属性存储常量或变量作为实例的一部分,计算属性计算(而不是存储)一个值.计算属性可以用于类.结构体和枚举里,存储属性只能用于类和结构体. 存储属性和计算属性通常用于特定类型的实例,但是,属性也可以直接用于类型本身,这种属性称为类型属性. 另外,还可以定义属性监视器来监控属性值的变化,以此来触发一个自定义的操作.属性监视器可以添加到自己写的存储属性上,也可以添加到从父类继承的属性上. 存储属性 简单来说,一个存储属性就是