(八十八)VFL语言初步 - 实现布局

【基本语法】

VFL的语法为H:和V:开头,代表水平和垂直。

接下来如果要涉及距离,使用|-x-,x为距离的点数。

对于视图,用[ ]包围,例如[blueView]。

①下面的语句实现了blueView水平方向左右各距离控制器的边缘20点:

H:|-20-[blueView]-20|

②如果要指定宽高,在视图名称之后用圆括号内填入常量数值,下面的代码实现了blueView距离左边20点,宽度固定为120点:

H:|-20-[blueView(20)]

③如果要指定相等关系,例如redView的宽度和blueView相等,则在开头为H:的条件下写[redView(==blueView)]。

④如果出现乘除计算,不能使用VFL,这时候应该使用NSLayoutConstraint的constraintWithItem:::::方法,计算公式为firstItem.x = (secondItem.x + constant) * multiplier,x为attribute指定的计算量,注意这个约束应该被添加到他们公共的父节点上。

【实现方法】

使用constraintsWithVisualFormat::::方法:

/**
     Format: VFL语句
     options:对齐方式
     metrics:VFL用到的变量
     views:VFL用到的视图
*/
+ (NSArray *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary *)metrics views:(NSDictionary *)views;

①如果不需要对齐,options填入0。

②views为在VFL中对应实际View的依据,例如@{@"redView":self.redView},当VFL中出现redView时,系统会通过views字典查找到self.redView,从而实现修改self.redView的尺寸。

③metrics为VFL中使用的变量,对于多次出现的值,可以用一个变量代替,然后在metrics中指定变量的值。

【实例】

下面的代码实现了blueView距离控制器View边缘左、中、右各20点,redView在blueView下20点,右对齐,宽度为blueView的一半。

需要注意的是禁用AutoResizing。

- (void)viewDidLoad {

    [super viewDidLoad];

    UIView *blueView = [[UIView alloc] init];
    blueView.backgroundColor = [UIColor blueColor];
    [self.view addSubview:blueView];

    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView];

    blueView.translatesAutoresizingMaskIntoConstraints = NO;
    redView.translatesAutoresizingMaskIntoConstraints = NO;

    NSArray *blueViewHori = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[blueView]-20-|" options:0 metrics:nil views:@{@"blueView":blueView}];
    [self.view addConstraints:blueViewHori];
    NSArray *blueRedVerti = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[blueView(50)]-20-[redView(==blueView)]" options:NSLayoutFormatAlignAllRight metrics:nil views:@{@"blueView":blueView,@"redView":redView}];
    [self.view addConstraints:blueRedVerti];

    NSLayoutConstraint *redViewWidthConstraint = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:blueView attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0];
    [self.view addConstraint:redViewWidthConstraint];

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 10:05:42

(八十八)VFL语言初步 - 实现布局的相关文章

Android开发笔记(八十八)同步与加锁

同步synchronized 同步方法 synchronized可用来给方法或者代码块加锁,当它修饰一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码.这就意味着,当两个并发线程同时访问synchronized代码块时,两个线程只能是排队做串行处理,另一个线程要等待前一个线程执行完该代码块后,才能再次执行synchronized代码块. 使用synchronized修饰某个方法,该方法便成为一个同步方法,在同一时刻只能有一个线程执行该方法.可是,synchronized的锁机制太

一起talk C栗子吧(第八十八回:C语言实例--使用管道进行进程间通信一)

各位看官们,大家好,上一回中咱们说的是使用管道进行进程间通信概述的例子,这一回咱们说的例子是:使用第一种管道进行进程间通信.闲话休提,言归正转.让我们一起talk C栗子吧! 我们在上一回中介绍了三种管道,这一回中我们介绍第一种管道(伪管道)及其使用方法.主要是让大家明白如何使用管道进行进程间的通信. 第一种管道我称之为伪管道.在介绍它之前,我们先介绍两个函数:popen和pclose. popen函数的原型 FILE * popen(const char * command, const ch

一个屌丝程序猿的人生(八十八)

次日醒来之后,看到太阳已经晒到屁股了,林萧先是猛地一惊,随后才想起今天原来是周六,怪不得闹钟没响. 林萧看了眼时间,已经快上午11点了,随后便一边慢吞吞的起床,一边思考着今天到底搞点什么. 这是林萧找到工作以后的第一个周末,可以说是难得清闲. 以往史晓玲在的时候,虽然二人几乎不说话,但有个人在旁边陪着,还是个女生,至少不会觉得无聊. 现在学习也学完了,史晓玲也不在了,再让他一个人在宿舍待一天,还是在这样一个轻松的周末,实在是让林萧觉得有些虚度光阴. 说来也奇怪,此时林萧的脑子里,突然冒出了欧阳晓

ActionScript3游戏中的图像编程(连载八十八)

总目录:http://blog.csdn.net/iloveas2014/article/details/38304477 4.5.2 矩阵卷积的ActionScript实现 下面我们就尝试着在ActionScript里实现它,哇,那岂不是要操作像素的吗?请放心,跟ColorMatrixFilter一样,ActionScript也帮我们实现了卷积的滤镜--ConvolutionFilter: ConvolutionFilter(matrixX:Number = 0, matrixY:Number

八十八、SAP中ALV事件之二,事件的定义和事件子例程

一.我们来到SE37,找到REUSE_ALV_EVENTS_GET相关的定义 二.我们需要用到下面这3个事件 三.我们添加一个第五步,并把显示ALV座位第六步.在第五步中定义三个事件 四.在末尾,添加3个子例程,未写相关的参数,相关参数在'REUSE_ALV_GRID_DISPLAY'中可以找到,我们后续再写 原文地址:https://www.cnblogs.com/tianpan2019/p/11273545.html

华为上机题汇总(十八)

华为上机题汇总(十八) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十八 目录 第八十六题 第八十七题 第八十八题 第八十九题 第九十题 第八十六题 86.合并输入的两个整形数组并去掉重复的数字按升序输出: 案例输入:3 1 2 5 -10 3 2 案例输出:-10 1 2 3 5 #include <iostream> #include <vector> #include <algorithm> using namespac

【C语言天天练(十八)】字符/字符串输入函数fgetc、fgets、getc、getchar和gets

#include <stdio.h> int fgetc(FILE *stream); char *fgets(char *s, int size, FILE *stream); int getc(FILE *stream); int getchar(void); char *gets(char *s); fgetc()读取文件指针stream所指向文件的下一个字符,返回值是所读取字符强制类型转换成整数的值,如果到达文件尾部或者出错,则返回EOF. getc()与fgetc()函数相同,只是它

C语言编程时常犯十八个错误

C语言的最大特点是:功能强.使用方便灵活.C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下"灵活的余地",但还是由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误.看着有错的程序,不知该如何改起,本人通过对C的学习,积累了一些C编程时常犯的错误,写给各位学员以供参考.1.书写标识符时,忽略了大小写字母的区别.main(){ int a=5; printf("%d",A);}编译程序把a和A认

C++语言笔记系列之十八——虚函数(1)

1.C++中的多态 (1)多态性:同一个函数的调用可以进行不同的操作,函数重载是实现多态的一种手段. (2)联编:在编译阶段进行联接,即是在编译阶段将一个函数的调用点和函数的定义点联接起来. A.静态联编:在编译阶段就完成的函数联编--函数重载. B.动态联编:在程序的运行阶段由系统自动选择具体的函数--虚函数. 注:C++的多态主要指的就是动态联编. 2.虚函数 (1)虚函数是在函数的定义时将其声明为虚函数即可. (2)说明:virtual 数据类型 函数名(参数表) {函数体} A.目的:当