先看官方
- (CGSize)sizeThatFits:(CGSize)size; // return 'best' size to fit given size. does not actually resize view. Default is return existing view size
- (void)sizeToFit; // calls sizeThatFits: with current view bounds and changes bounds size.
意思是说:
- (CGSize)sizeThatFits:(CGSize)size; 会返回一个最适合的 Size,但是不会改变原来视图的frame 的size
- (void)sizeToFit; 内部会调用 - (CGSize)sizeThatFits:(CGSize)size; 方法获取一个最适合的size, 并使用这个size 来调整当前视图的frame 的size.
简单的说:- (CGSize)sizeThatFits:(CGSize)size; 和 - (void)sizeToFit; 都或获取一个最适合的Size, 但是- (CGSize)sizeThatFits:(CGSize)size; 不会改变原始图的frame,仅仅是返回一个size, 而- (void)sizeToFit; 会为你计算一个最合适的Size的同时,并根据这个Size来调整你当前视图的frame
可以通过固定宽度
或者高度
,来自适应高度
或者宽度
。
如果自适应不限制,调用- (void)sizeToFit
即可。
如果存在最大高度需要如下使用sizeThatFits
。
注意:sizeThatFits:CGSizeMake(300, MAXFLOAT)
给参数不能给CGSizeZero
,否则会不换行,只会一行显示。
_contentLabel = [[UILabel alloc] init];
_contentLabel.numberOfLines = 0;
_contentLabel.textColor = [UIColor grayColor];
_contentLabel.font = [UIFont systemFontOfSize:15];
_contentLabel.backgroundColor = [UIColor clearColor];
[self addSubview:_contentLabel];
[_contentLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(_numberLabel.mas_bottom).mas_offset(0);
make.left.mas_equalTo(bgView.mas_right).mas_offset(10);
make.right.mas_offset(-10);
}];
_contentLabel.text = @"当设置多行显示时,两者又体现出区别,sizeThatFits并不会折行显示,sizeToFits会在设置的宽度内这行显示。这实际上又从另一方面验证了官方的解释。知其然,更要知其所以然,学习没有捷径,坚持和专研是硬道理,多分享则乐趣无穷!欢迎关注后续博文";
// [_contentLabel sizeToFit];
CGSize contenSize = [_contentLabel sizeThatFits:CGSizeMake(300, MAXFLOAT)];
CGFloat contentHeight = contenSize.height;
if (contenSize.height > 70) {
contentHeight = 70;
}
[_contentLabel mas_updateConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo(contentHeight);
}];
写的比较啰嗦,可以封装一下
运行效果如下:
WechatIMG81.png
这篇写的也好:https://blog.csdn.net/huangfei711/article/details/77435614
网友评论