IOS开发学习笔记039-autolayout 代码实现
本文转载至 http://www.cnblogs.com/songliquan/p/4548206.html
1、代码实现比较复杂
-
代码实现Autolayout的步骤
-
利用NSLayoutConstraint类创建具体的约束对象
-
添加约束对象到相应的view上
-
1 - (void)addConstraint:(NSLayoutConstraint *)constraint; 2 3 - (void)addConstraints:(NSArray *)constraints;
-
代码实现Autolayout的注意点
-
要先禁止autoresizing功能,设置view的下面属性为NO
view.translatesAutoresizingMaskIntoConstraints = NO;
-
添加约束之前,一定要保证相关控件都已经在各自的父控件上
-
不用再给view设置frame
-
-
一个NSLayoutConstraint对象就代表一个约束
// 创建约束对象的常用方法 +(id)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c; view1:要约束的控件 attr1:约束的类型(做怎样的约束) relation:与参照控件之间的关系 view2:参照的控件 attr2:约束的类型(做怎样的约束) multiplier:乘数 c:常量
-
自动布局的核心计算公式
view1.attr1 =(view2.attr2 * multiplier)+ c ;
-
约束添加规则
- 对于两个同层级view之间的约束关系,添加到它们的父view上。
-
对于两个不同层级view之间的约束关系,添加到他们最近的共同父view上
-
对于有层次关系的两个view之间的约束关系,添加到层次较高的父view上
2、简单练习:一个view
- 实现一个大小为100*200的redView显示到view中,距离左边和顶部间距都是20
1 // 实现一个大小为100*200的redView显示到view中,距离左边和顶部间距都是20 2 UIView *redView = [[UIView alloc] init]; 3 redView.backgroundColor = [UIColor redColor]; 4 // 关闭控件的自动添加约束功能 5 redView.translatesAutoresizingMaskIntoConstraints = NO; 6 // 先把控件添加到父控件才能接着添加约束 7 [self.view addSubview:redView]; 8 // 设置宽度 9 NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0 constant:100]; 10 [redView addConstraint:widthConstraint]; 11 // 设置高度 12 NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeHeight multiplier:0 constant:200]; 13 [redView addConstraint:heightConstraint]; 14 // 设置尺寸:距离顶部20 15 NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:20]; 16 [self.view addConstraint:topConstraint]; 17 // 距离左边约束20 18 NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1 constant:20]; 19 [self.view addConstraint:leftConstraint];
3、练习:两个view
-
在控制器view顶部添加2个view,1个蓝色,1个红色
-
2个view高度永远相等
-
红色view和蓝色view右边对齐
-
蓝色view距离父控件左边、右边、上边间距相等
-
蓝色view距离红色view间距固定
-
红色view的左边和父控件的中点对齐
-
1 UIView *redView = [[UIView alloc] init]; 2 redView.backgroundColor = [UIColor redColor]; 3 // 关闭控件的自动添加约束功能 4 redView.translatesAutoresizingMaskIntoConstraints = NO; 5 // 先把控件添加到父控件才能接着添加约束 6 [self.view addSubview:redView]; 7 8 UIView *blueView = [[UIView alloc] init]; 9 blueView.backgroundColor = [UIColor blueColor]; 10 // 关闭控件的自动添加约束功能 11 blueView.translatesAutoresizingMaskIntoConstraints = NO; 12 // 先把控件添加到父控件才能接着添加约束 13 [self.view addSubview:blueView]; 14 15 /** 16 * - 在控制器view顶部添加2个view,1个蓝色,1个红色 17 - 2个view高度永远相等 18 - 红色view和蓝色view右边对齐 19 - 蓝色view距离父控件左边、右边、上边间距相等 :20 20 - 蓝色view距离红色view间距固定 21 - 红色view的左边和父控件的中点对齐 22 */ 23 24 /**************blue*********************************************************/ 25 // blueHeight 26 NSLayoutConstraint *blueHeight = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:kNilOptions multiplier:0 constant:40]; 27 [self.view addConstraint:blueHeight]; // 同级控件之间的约束要添加到共同的父控件 28 29 //蓝色view距离父控件左边、右边、上边间距相等 :20 30 NSLayoutConstraint *blueViewRight = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1 constant:-20]; 31 [self.view addConstraint:blueViewRight]; 32 33 NSLayoutConstraint *blueViewTop = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:20]; 34 [self.view addConstraint:blueViewTop]; 35 36 NSLayoutConstraint *blueViewLeft = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1 constant:20]; 37 [self.view addConstraint:blueViewLeft]; 38 39 /**************red*********************************************************/ 40 // - redview与blueview等高 41 NSLayoutConstraint *equalHeight = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem: blueView attribute:NSLayoutAttributeHeight multiplier:1 constant:0]; 42 [self.view addConstraint:equalHeight]; // 43 44 // - redview的左边和父控件的中点对齐 45 NSLayoutConstraint *centerX = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]; 46 [self.view addConstraint:centerX]; // 47 48 // - redview距离blueView间距20 49 NSLayoutConstraint *margin = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:blueView attribute:NSLayoutAttributeBottom multiplier:1 constant:20]; 50 [self.view addConstraint:margin]; // 51 52 //- 红色view和蓝色view右边对齐 53 NSLayoutConstraint *equalRight = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:blueView attribute:NSLayoutAttributeRight multiplier:1 constant:0]; 54 [self.view addConstraint:equalRight]; //
4、使用VFL语言简化代码
visual Format Lauguage ,可视化格式语言
可以使用VFL实现自动布局代码的简化。
VFL的使用
- 使用VFL来创建约束数组
1 + (NSArray *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary *)metrics views:(NSDictionary *)views; 2 3 format :VFL语句 4 opts :约束类型 5 metrics :VFL语句中用到的具体数值 6 views :VFL语句中用到的控件
- 创建一个字典(内部包含VFL语句中用到的控件)的快捷宏定义
NSDictionaryOfVariableBindings(...)
NSDictionaryOfVariableBindings(abc);
返回一个字典对象,内容为{@"abc" : abc};
4.1、VFL示例1:一个View
1 代码示例 2 UIView *redView = [[UIView alloc] init]; 3 redView.backgroundColor = [UIColor redColor]; 4 // 关闭控件的自动添加约束功能 5 redView.translatesAutoresizingMaskIntoConstraints = NO; 6 // 先把控件添加到父控件才能接着添加约束 7 [self.view addSubview:redView]; 8 NSString *vfl = @"H:[redView(100)]-20-|"; // 设置宽度100,距离右边20 9 NSDictionary *view = @{@"redView" : redView}; 10 // 水平方向约束 11 NSArray *constraint = [NSLayoutConstraint constraintsWithVisualFormat:vfl options:kNilOptions metrics:nil views:view]; 12 [self.view addConstraints:constraint]; 13 // 垂直方向约束 14 vfl = @"V:|-100-[redView(200)]"; // 设置高度200,距离顶部100 15 NSArray *constraint2 = [NSLayoutConstraint constraintsWithVisualFormat:vfl options:kNilOptions metrics:nil views:view]; 16 [self.view addConstraints:constraint2 ];
4.2、VFL示例2:居中显示
// 居中显示 UIView *redView = [[UIView alloc] init]; redView.backgroundColor = [UIColor redColor]; // 关闭控件的自动添加约束功能 redView.translatesAutoresizingMaskIntoConstraints = NO; // 先把控件添加到父控件才能接着添加约束 [self.view addSubview:redView]; NSNumber *margin = @100; NSString *vfl = @"H:|-margin-[redView]-margin-|"; // 设置宽度100,距离右边20 NSDictionary *view = @{@"redView" : redView}; NSDictionary *metric = @{@"margin" : margin}; // 水平方向约束 NSArray *constraint = [NSLayoutConstraint constraintsWithVisualFormat:vfl options:NSLayoutFormatAlignAllCenterX metrics:metric views:view]; [self.view addConstraints:constraint]; // 垂直方向约束 NSDictionary *view2 = NSDictionaryOfVariableBindings(redView); NSDictionary *metric2 = NSDictionaryOfVariableBindings(margin); vfl = @"V:|-margin-[redView]-margin-|"; // 设置高度200,距离顶部100 NSArray *constraint2 = [NSLayoutConstraint constraintsWithVisualFormat:vfl options:NSLayoutFormatAlignAllCenterY metrics:metric2 views:view2]; [self.view addConstraints:constraint2 ];
4.3、VFL示例:并排显示
1 UIView *blueView = [[UIView alloc] init]; 2 blueView.backgroundColor = [UIColor blueColor]; 3 // 不要将AutoresizingMask转为Autolayout的约束 4 blueView.translatesAutoresizingMaskIntoConstraints = NO; 5 [self.view addSubview:blueView]; 6 7 UIView *redView = [[UIView alloc] init]; 8 redView.backgroundColor = [UIColor redColor]; 9 // 不要将AutoresizingMask转为Autolayout的约束 10 redView.translatesAutoresizingMaskIntoConstraints = NO; 11 [self.view addSubview:redView]; 12 13 // 间距 14 NSNumber *margin = @20; 15 // 添加水平方向的约束 16 NSString *vfl1 = @"H:|-margin-[blueView]-margin-[redView(==blueView)]-margin-|"; 17 18 NSDictionary *views = NSDictionaryOfVariableBindings(blueView,redView); 19 NSDictionary *mertics = NSDictionaryOfVariableBindings(margin); 20 NSArray *cons = [NSLayoutConstraint constraintsWithVisualFormat:vfl1 options:NSLayoutFormatAlignAllBottom | NSLayoutFormatAlignAllTop metrics:mertics views:views]; 21 22 [self.view addConstraints:cons]; 23 // 添加竖直方向的间距 24 // 高度 25 NSNumber *height = @100; 26 NSString *vfl2 = @"V:[blueView(height)]-margin-|"; 27 NSDictionary *views2 = NSDictionaryOfVariableBindings(blueView); 28 NSDictionary *mertics2 = NSDictionaryOfVariableBindings(margin,height); 29 NSArray *cons2 = [NSLayoutConstraint constraintsWithVisualFormat:vfl2 options:kNilOptions metrics:mertics2 views:views2]; 30 [self.view addConstraints:cons2];