在Autolayout情况下使用Frame
1、在AutoLayout生效之前使用Frame,设置的Frame是无效的,因为系统会在布局完后重新计算Frame,例如在ViewDidLoad中先布局再设置了Frame。
2、在AutoLaout生效之后是用Frame,例如有时候做动画的时候会改它的Frame,这时候是设置Frame是可以生效的,但是他的父View子View、统计View不会由于该View改变了Frame而重新布局,如果触发了父View的-layoutSubViews,又会根据自动布局重新设置Frame,设置的Frame又会被还原,所以最好不要在设置AutoLayout之后再去改Frame。(该种情况下可以考虑做动画完成后还原)。
Priorities
各个约束力量的大小,由constraint的优先级(Priorities)决定,优先级越高,力量越大。系统的优先级由1~1000的数字表示,值越大,优先级越高。NSLayoutConstraint中一共定义了4种比较常用的优先级
typedef float UILayoutPriority
static const UILayoutPriority UILayoutPriorityRequired NS_AVAILABLE_IOS(6_0) = 1000;
static const UILayoutPriority UILayoutPriorityDefaultHigh NS_AVAILABLE_IOS(6_0) = 750;
static const UILayoutPriority UILayoutPriorityDefaultLow NS_AVAILABLE_IOS(6_0) = 250;
static const UILayoutPriority UILayoutPriorityFittingSizeLevel NS_AVAILABLE_IOS(6_0) = 50;
1.UILayoutPriorityRequired,优先级最高,为1000,一般平时定的约束优先级都是这个。
2.UILayoutPriorityDefaultHigh,优先级是750,CompressionResistance的默认优先级是这个。
3.UILayoutPriorityDefaultLow,优先级是250,ContentHugging的默认优先级是这个。
4.UILayoutPriorityFittingSizeLevel,优先级是50
因为平时我们约束的默认优先级是UILayoutPriorityRequired,所以可以解释自定义约束label的size的时候,可以不根据其内容的大小自行设定其大小。
ContentHugging和CompressionResistance
ContentHugging指拉伸程度,该属性的优先级越高,越不容易被拉伸,其默认优先级是UILayoutPriorityDefaultLow(250)
例子:如果label自适应的宽是100,设置了其约束宽为200,优先级为251,大于其默认优先级,所以宽会被拉伸至200。
[label makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self).offset(100);
make.left.equalTo(self).offset(100);
make.width.equalTo(200).priority(251);
}];
结果如下图:
优先级为251如果将优先级改为249,label的宽是不会给拉伸的,因为优先级小于其默认优先级,所以label的宽是内容自适应的宽
优先级为249
CompressionResistance是指压缩能力,该属性的优先级越高,越不容易被压缩,其默认优先级是UILayoutPriorityDefaultHigh(750)
例子:如果label的自适应宽是100,是指了其约束宽为50,优先级是751,大于其默认优先级,所以宽会被压缩至50。
[label makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self).offset(100);
make.left.equalTo(self).offset(100);
make.width.equalTo(50).priority(751);
}];
优先级是751
如果将优先级改为749,label的宽是不会给压缩的,因为优先级小于其默认优先级,所以label的宽是内容自适应的宽
优先级为749
还有一个很好的例子,就是两个label并排,可以实现一个label的宽度自适应,另外一个label的宽度可自由伸缩。
UILabel *label1 = [[UILabel alloc] init];
label1.text = @"我是男孩男孩男孩";
label1.backgroundColor = [UIColor greenColor];
[self addSubview:label1];
[label1 makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self).offset(100);
make.left.equalTo(self).offset(10);
}];
UILabel *label2 = [[UILabel alloc] init];
label2.text = @"我是女孩女孩女孩女孩女孩女孩";
label2.backgroundColor = [UIColor greenColor];
[self addSubview:label2];
[label2 makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(label1);
make.left.equalTo(label1.mas_right).offset(10);
make.right.equalTo(self).offset(-10);
}];
实际效果:
如果想实现label2内容自适应,label1宽度根据label2的宽度自由调节,可以降低label1的CompressionResistance优先级,或者提高label2的CompressionResistance优先级。
[label1 setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal];
或者
[label2 setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
网友评论