标签:
Autoresizing
1.Autoresizing四周的四根线的作用:
2.Autoresizing中间两条线的作用:
3.无论是将子控件固定在父控件的某一个位置 还是让子控件随着父控件的宽高的变化而变化
4 都是父子关系,所以Autoresizing只能约束父子控件之间的关系, 不能约束兄弟控件之间的关系
属性
@property(nonatomic) UIViewAutoresizing autoresizingMask;
// simple resize. default is UIViewAutoresizingNone
// 设置子控件的autoresizing
注意: 代码中的上下左右和Storyboard中的是相反的
Storyboard中勾选上左边, 就代表当前控件和父控件的左边的距离是固定的
而在代码中如果写上FlexibleLeftMargin, 就代表当前控件和父控件的左边是可拉伸的
换句话说就是: 如果设置了FlexibleLeftMargin, 就代表着右边是固定的
UIViewAutoresizingFlexibleLeftMargin // 左边可以伸缩
UIViewAutoresizingFlexibleRightMargin // 右边可以伸缩
UIViewAutoresizingFlexibleTopMargin // 顶部可以伸缩
UIViewAutoresizingFlexibleBottomMargin // 底部可以伸缩
// 以下两个和Storyboard中的是一样的
UIViewAutoresizingFlexibleWidth // 宽度可以伸缩
UIViewAutoresizingFlexibleHeight // 高度可以伸缩
Autolayout
1.约束
每在Storyboard中添加一个设置(autolayout的设置), 就代表添加一个约束
2.错误(红色箭头)
如果看到Storyboard中有红色的箭头, 代表约束有错误
注意: 约束有错误, 不代表运行会错误, 约束有错误同样可以运行
注意: 红色箭头是程序员必须解决的
4.注意
5.警告
#warning 注意点: 如果通过代码来设置Autolayout约束, 那么必须先禁用Autoresizing
redView.translatesAutoresizingMaskIntoConstraints = NO;
Item == first item
attribute == first item需要设置的约束类型
relatedBy == Relatio(等于)
toItem == Second item
attribute == Second item的约束类型
multiplier == 乘以
constant == 加上多少
// 2.1宽度
NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:kNilOptions multiplier:1.0 constant:100.0];
// 将约束添加给自己
[redView addConstraint:width];
VFL
// 1.禁止红色View的Autgoresizing
blueVeiw.translatesAutoresizingMaskIntoConstraints = NO;
redVeiw.translatesAutoresizingMaskIntoConstraints = NO;
// 2.利用VFL添加约束
/*
VisualFormat: VFL语句
options: 对齐方式等
metrics: VFL语句中使用到的一些变量
views: VFL语句中使用到的一些控件
*/
// 3.1设置蓝色
// 3.1.1水平方向
NSArray *blueHCos = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[blueVeiw]-20-|" options:kNilOptions metrics:nil views:@{@"blueVeiw":blueVeiw}];
[self.view addConstraints:blueHCos];
// 3.1.2垂直方向
NSArray *blueVCos = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[blueVeiw(==50)]" options:kNilOptions metrics:nil views:@{@"blueVeiw":blueVeiw}];
[self.view addConstraints:blueVCos];
Masonry框架
```objc
//define this constant if you want to use Masonry without the ‘mas_‘ prefix
define MAS_SHORTHAND
// 只要添加这个宏,就可以去掉Masonry框架中对象访问对象属性前面的mas_属性, 和方法前的mas_前缀
// 例如添加前的写法
make.left.equalTo(self.view.mas_left).with.offset(20);
// 例如添加后的写法
make.left.equalTo(self.view.left).with.offset(20);
//define this constant if you want to enable auto-boxing for default syntax
define MAS_SHORTHAND_GLOBALS
// 只要添加上这个宏, 给equalTo传递参数的时候, 就可以直接传递基本数据类型 ,系统会自动包装
// 如果没有添加上面这个宏, 那么给equalTo传递参数的时候, 必须传递对象
// 如果要传递基本数据类型必须使用mas_equalTo
// 只需要在导入Masonry.h之前, 添加上一上两个宏, 就可以简化代码
UIView *blueVeiw = [[UIView alloc] init];
blueVeiw.backgroundColor = [UIColor blueColor];
[self.view addSubview:blueVeiw];
self.blueVeiw = blueVeiw;
UIView *redVeiw = [[UIView alloc] init];
redVeiw.backgroundColor = [UIColor redColor];
[self.view addSubview:redVeiw];
// 2.禁止红色View的Autgoresizing
blueVeiw.translatesAutoresizingMaskIntoConstraints = NO;
redVeiw.translatesAutoresizingMaskIntoConstraints = NO;
// 3.添加蓝色的约束
[blueVeiw makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.view.left).offset(20);
make.right.equalTo(self.view.right).offset(-20);
make.top.equalTo(self.view.top).offset(20);
make.height.equalTo(50);
}];
// 4.添加红色的约束
[redVeiw makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(blueVeiw.bottom).offset(20);
make.height.equalTo(blueVeiw.height);
make.right.equalTo(blueVeiw.right);
make.width.equalTo(blueVeiw.width).multipliedBy(0.5);
}];
//注意: 在Storyboard中约束是可以重复添加的, 通过Masonry添加约束也是可以重复的, 要注意重复添加导致的错误和冲突
// 使用makeConstraints, 每次都会添加新的约束, 也就是会导致重复添加
// [self.blueVeiw makeConstraints:^(MASConstraintMaker *make) {
// make.height.equalTo(100); }];
// 要更新约束使用updateConstraints
// updateConstraints特点: 如果没有设置过, 就添加一个新的
// 如果已经设置过了, 就更新以前设置的那一个
[self.blueVeiw updateConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(100); }];
// 清空约束 remakeConstraints
[self.blueVeiw remakeConstraints:^(MASConstraintMaker *make) { }];
标签:
原文地址:http://www.cnblogs.com/liujiaoxian/p/4703490.html