参考UI_day3_UIview_dock
停靠模式要满足下面条件:
1.必须父视图允许子视图自动布局
_baseView.autoresizesSubviews=YES;//允许子视图随着自己尺寸变化而变化
2.子视图自己设置布局方式
view.autoresizingMask=UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;//子视图设置变化模式
二 代码实现AutoLayout添加约束
NSLayoutConstraint类;
NSLayoutConstraint * constraint1=[NSLayoutConstraint constraintWithItem:self.baseView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:10];
/**
参数:
1.firstItem 这个对象在约束哪个界面
2.给 第一个参数 添加什么约束
3.和约束的值的关系 >= == <=
4.secondItem 相对于谁的约束
5.给 第四个参数的 约束类型
6.比例
7.约束的值
核心运算表达式:(First Item)=(Second Item)*Multiplier+Constant;
*/
每个视图,除了自身的宽高的约束可以添加到自身视图以外,其他约束都添加到父视图上面。
自身高度:
NSLayoutConstraint *heightConstraint2 = [NSLayoutConstraint constraintWithItem:self.blueView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:200];
//自身的高的约束 也可以加到 父视图
[self.view addConstraint:heightConstraint2];
三,VFL语言
VLF语言,visual format language,一种格式化语言。有点像正则表达式;能够快速创建很多约束:
主要方法:
NSArray *constraintArr1 = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[_redView(100)]" options:0 metrics:nil views:dict];
第一个参数,提供约束的描述表达式,第二个参数传0,第三个参数传nil,第四个参数传入一个字典,字典的目的主要是用来查找相关视图的对象;
第四个字典参数可以使用方法NSDictionaryOfVariableBindings()来创建。
关于约束描述表达式
@"V:",表示垂直方向的约束
@"H:",表示水平方向的约束
@"[view]-[view]",表示两个视图之间的间距,不写具体数字为8像素
@"V:[view]-20-[view]";写了具体数字,表示距离具体为多少
@"[view(100)]",表示view宽度/高度为100
@"[view(>=50)]",表示view宽度/高度大于等于50
@"|-50-[view]-50-|",表示view距离左/上边距50,距离右/下边距50;
@"[view1][view2]",表示在水平/垂直方向紧紧靠着
@"[view(100@20)]",表示view宽度/高度为100,优先级为20;
@"[view(==view1)]",表示view的宽度/高度和view1相同
@"[view(>=10,<=100)]",表示view的宽度/高度大于等于10,小于等于100;
@"H:|-[view(100)]-[view1(100)]-[view2(>=20)]-|",你猜!
Demo实例:
//在 添加约束之前 必须保证 子视图已经粘贴到父视图上
_redView = [[UIView alloc] initWithFrame:CGRectZero];
_redView.backgroundColor = [UIColor redColor];
[self.view addSubview:_redView];
_redView.translatesAutoresizingMaskIntoConstraints = NO;
_blueView = [[UIView alloc] initWithFrame:CGRectZero];
_blueView.backgroundColor = [UIColor blueColor];
[self.view addSubview:_blueView];
_blueView.translatesAutoresizingMaskIntoConstraints = NO;
//上面确定父子视图关系 ,下面 使用vfl语言 添加约束
//提供一个字典 传入 告知 系统 vfl 的格式字符串中 出现_redView字符串 就表示 操作的是_redView指针指向的对象
//NSDictionary *dict = @{@"_redView":_redView,@"_blueView":_blueView};
//下面的 带参数的宏 等价于 上面的字典形式
NSDictionary *dict = NSDictionaryOfVariableBindings(_redView,_blueView);
NSLog(@"%@",dict);
//@"H:|-20-[_redView(100)]" 给_redView 增加水平方向的约束
//H: 水平方向
//|边界
//H:|-20- ->表示水平 距离左边界20
//[_redView(20)] -> _redView指向的视图对象 自身宽20
//函数内部 解析 vfl 格式字符串 得到 多个约束
NSArray *constraintArr1 = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[_redView(100)]" options:0 metrics:nil views:dict];
//增加到父视图约束
[self.view addConstraints:constraintArr1];
//垂直方向
//垂直方向的约束
//_redView 距离顶部 50 自身高 200
NSArray *constraintArr2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-50-[_redView(200)]" options:0 metrics:nil views:dict];
[self.view addConstraints:constraintArr2];
//蓝色视图
//函数内部 解析 vfl 格式字符串 得到 多个约束
//水平
//
//_blueView 水平方向 的约束:距离 _redView水平间距50 自身宽 == _redView的宽
NSArray *constraintArr3 = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[_redView]-50-[_blueView(==_redView)]" options:0 metrics:nil views:dict];
//增加到父视图约束
[self.view addConstraints:constraintArr3];
//垂直方向
NSArray *constraintArr4 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-100-[_blueView(==_redView)]" options:0 metrics:nil views:dict];
[self.view addConstraints:constraintArr4];