UILabel高度控制

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会根据传入的sizewidth自动换行,得到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
2
3
4
NSString *text = @"Today is a fine day";
UIFont *font = [UIFont systemFontOfSize:30];
CGRect suggestedRect = [text boundingRectWithSize:CGSizeMake(800, MAXFLOAT) options:NSStringDrawingUsesFontLeading attributes:@{ NSFontAttributeName : font } context:nil];
NSLog(@"size = %@", NSStringFromCGSize(suggestedRect.size));