记录控件自适应相关内容
TextView
需求是TextView根据内容自适应宽高,但有最大200,最小100的限制要求。
通过自定义textView实现:
Intrinsic Content Size:固有大小。在AutoLayout中如果没有指定大小,它就按照这个大小来设置。 比如 UILabel UIImageView UIButton等组件,都只需要设置位置而不设大小即可。
@implementation EWTextView
-(void)setContentSize:(CGSize)contentSize{
[super setContentSize:contentSize];
[self invalidateIntrinsicContentSize];
}
-(CGSize)intrinsicContentSize{
NSLog(@"%@",NSStringFromCGSize(self.contentSize));
if (self.contentSize.height <= 100) {
return CGSizeMake(self.contentSize.width, 100);
}else if(self.contentSize.height > 200){
return CGSizeMake(self.contentSize.width, 200);
}
return self.contentSize;
}
@end
使用
- (void)viewDidLoad {
[super viewDidLoad];
EWTextView *textview = [[EWTextView alloc]init];
textview.backgroundColor = [UIColor redColor];
[self.view addSubview:textview];
[textview mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(@20);
make.top.equalTo(@100);
make.right.equalTo(@-100);
}];
}
Intrinsic 冲突
如下图示两个Label 均有Intrinsic contentsize 对Label2 增了跟右侧的约束,则会出现 Intrinsic 冲突。
解决
- 两个UILabel都放弃使用Intrinsic,为它们设置宽高。
- 其中一个UILabel 使用 Intrinsic contentsize,另一个使用剩余宽度。
content Hugging
约束(不想变大约束)表示:如果组件的此属性优先级比另一个组件此属性优先级高的话,那么这个组件就保持不变,另一个可以在需要拉伸的时候拉伸。属性分横向和纵向2个方向。
Content Compression Resistance
约束(不想变小约束)表示:如果组件的此属性优先级比另一个组件此属性优先级高的话,那么这个组件就保持不变,另一个可以在需要压缩的时候压缩。属性分横向和纵向2个方向。
两个 UIlabel 例子中,如果某个UILabel使用Intrinsic Content Size的时候,另一个需要拉伸。 所以我们需要调整两个UILabel的 Content Hugging约束的优先级就可以。