关键函数
iOS6以前
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
此函数已经标记为废弃iOS7以后
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary<NSString *, id> *)attributes context:(nullable NSStringDrawingContext *)context
注意点
这个问题一般在UILabel中遇到,但其实是NSString的一个方法。所以在UILabel和UITextView或者UIWebView中都可以使用。
为了获得一个CGRect,需要先提供一个CGSize的参数。这点是自己一直比较难理解的。基本的思路是宽和高先确定一个,另外一个给一个很大很大的数,然后从结果中得出另外一个相对准确的数值。比如表格的cell中是一个内容不确定的UILabel,宽度一般是表格的宽度或者干脆是屏幕的宽度,然后就可以利用这个方法获得高度。这样cell的高度就比较容易获得了。
对于UILabel,numberOfLines一般要先设置为0,允许多行文本
font属性要制定,不过是在attributes参数中,这是一个NSAttributedString的属性,是一个字典,具体的要去相应的头文件查看。这也是这个函数难用的地方
options参数一般选第一个
NSStringDrawingUsesLineFragmentOrigin
context参数一般给nil
得出的size,一般width事先知道,height是我们希望得到的。得到的结果需要加1,不然,字符就是放不下,出现...。这个只是实际遇到,不应该这样,原因不明。
例子代码
//获取多行字符串的宽度和高度
UILabel *titleLabel = [[UILabel alloc]init];
titleLabel.font = [UIFont systemFontOfSize:13];
NSString *titleContent = @"获取 UILabel 宽度和高度测试获取 UILabel 宽度和高度测试获取 UILabel 宽度和高度测试获取 UILabel 宽度和高度测试获取 UILabel 宽度和高度测试获取 UILabel 宽度和高度测试获取 UILabel 宽度和高度测试";
titleLabel.text = titleContent;
titleLabel.numberOfLines = 0;//多行显示,计算高度
titleLabel.textColor = [UIColor lightGrayColor];
CGSize titleSize = [titleContent boundingRectWithSize:CGSizeMake(kScreen_Width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:13]} context:nil].size;
titleLabel.size = titleSize;
[self.view addSubview:titleLabel];