博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS:VFL语言
阅读量:6206 次
发布时间:2019-06-21

本文共 4425 字,大约阅读时间需要 14 分钟。

VFL语言

 
介绍:
什么是VFL语言?
VFL全称是Visual Format Language,翻译过来是“可视化格式语言”
VFL是苹果公司为了简化Autolayout的编码而推出的抽象语言
 
VFL示例:
H:[cancelButton(72)]-12-[acceptButton(50)]
cancelButton宽72,acceptButton宽50,它们之间间距12
 
H:[wideView(>=60@700)]
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];
旋转屏幕的演示结果如下:

 

 

 

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
分类:
 
 
本文转自当天真遇到现实博客园博客,原文链接: ,如需转载请自行联系原作者
 
你可能感兴趣的文章
DWT算法
查看>>
Android 经典示例,初学者的绝好源码资料
查看>>
linux新起之秀-linux文件属性
查看>>
Python学习笔记(二)
查看>>
对象运算符"."和"[]"的用法
查看>>
如何用组策略来找到丢失的文件
查看>>
使用Apache Tomcat Maven插件部署运行 Web 项目
查看>>
centos关于”running yum-complete-transaction first...
查看>>
linux命令积累之egrep命令
查看>>
使用Javascript正则表达式来格式化XML内容
查看>>
poxtfix+dovecot+saslauthd+courier-authlib +mysql + extmail 完整虚拟邮箱系统部署
查看>>
我的友情链接
查看>>
spark内核揭秘-02-spark集群概览
查看>>
《C语言深度剖析》学习笔记三
查看>>
自主做一个类似于微博的项目(计划篇)
查看>>
深入理解Java:注解(Annotation)
查看>>
Erlang并发机制 –进程调度
查看>>
Java环境搭建若干问题
查看>>
VBA and Access
查看>>
不可不说的Java“锁”事
查看>>