在tableview自适应高度一篇中学习了如何用systemLayoutSizeFittingSize:
方法得到UITableView的Cell的高度。本文将探究一般情况下如何得到UILabel的高度。
sizeThatFits的使用
sizeThatFits
是UIView中的方法:1
- (CGSize)sizeThatFits:(CGSize)size;
官方文档的注释:
return ‘best’ size to fit given size. does not actually resize view. Default is return existing view size
也就是说,该方法将会根据传入的size
,计算得到最佳的UIView的宽高,直接返回,不对View做任何修改。
UILabel会根据传入的size
的width
自动换行,得到height
后,将这两个值作为估算出的CGSize
返回。
如果传入的是CGSizeZero
相当于不设置换行宽度,一行到底。
由于SizeThatFits
只估算,不修改。在得到估算值后,需要手动设置UILabel的frame
或者constraint
:1
2
3
4
5
6
7
8
9
10
11- (void) useSizeThatFitsZeroWithLabel:(UILabel *)label{
//使用CGSizeZero相当于不设置换行宽度,一行到底
CGSize size = [label sizeThatFits:CGSizeZero];
label.frame = CGRectMake(label.frame.origin.x, label.frame.origin.y, size.width, size.height);
}
- (void) useSizeThatFitsCustomWithLabel:(UILabel *)label{
//使用自定义的CGSize,会根据size的宽度进行换行
CGSize size = [label sizeThatFits:CGSizeMake(50, 50)];
label.frame = CGRectMake(label.frame.origin.x, label.frame.origin.y, size.width, size.height);
}
SizeToFit
SizeToFit
的方法:1
- (void)sizeToFit;
SizeToFit
的文档注释:
calls sizeThatFits: with current view bounds and changes bounds size.
也就是说,它会调用SizeThatFits
,并且直接设置View的bounds
。
既然要调用sizeThatFits
那就需要传入一个CGSize
。这个CGSize
就是设置View的frame
时传入的height
,width
。
boundingRectWithSize
boundingRectWithSize
其实和上面的方法差不多,但是前面的方法需要拿到 label 的实例。下面这个方法则是通过 String 直接计算的:
1 | NSString *text = @"Today is a fine day"; |