由NSString估算UILabel的高度
一.项目的实际需要
在刚完成的两个项目中,我都是负责封装UITableViewCell,没有使用xib或者storyBoard,而是纯代码布局。其中,在对UILabel高度、行数的处理上耗费了较多时间,基本掌握了一些规律,但是还是有一些遗留bug,不着急,坑要一个一个填,今天暂且先总结这么多。这篇文章主要介绍使用NSString的boundingRectWithSize:函数估算UILabel的高度,以及如何多行显示、截断显示。
二. 根据NSString计算UiLabel高度
NSString类有一个实例方法,boundingRectWithSize:options: attributes: context: ,来估算绘制当前的NSString需要的CGRect。为什么说估算,是因为我在使用的时候遇到过高度计算不准确的情况,对这个问题感兴趣的可以看下stackoverflow.com/questions/13621084/boundingrectwithsize-for-nsattributedstring-returning-wrong-size。逐个参数看下吧。
size:(CGRectSize) 指你限定的宽跟高,比如(200,MAXFLOAT)指的是,你想把NSString显示区域的宽限定在200像素,高度任意。
options:根据苹果官方文档,想要更准确的绘制多行的大小,使用NSStringDrawingUsesLineFragmentOrigin。stackOverflow上有人建议使用NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading更准确。
attributes:(NSDictionary *) 可以使用NSFontAttributeNam key来指定字体跟大小,NSForegroundColorAttributeName来设置颜色,NSParagraphStyleAttributeName来指定段落属性。如:
@{
NSFontAttributeName: [UIFont boldSystemFontOfSize:15],
NSForegroundColorAttributeName: [UIColor blackColor],
NSParagraphStyleAttributeName: paragraphStyle
}
context:上下文,这个我目前都是写nil
三.使用ceil()
之前没仔细阅读过苹果官方文档,后来发现有这么一段介绍:This method returns fractional sizes (in the size component of the returned CGRect); to use a returned size to size views, you must raise its value to the nearest higher integer using the ceil function.所以需要用ceil函数得到高度(宽度)的最近integer值。第一次就踩了一个坑,没用这个函数,导致我的UILabel的计算高度小于实际要展现的高度导致文本被截断了。
四.如何限制UILabel显示的行数
UILabel有一个numberLines的属性,当设置为0时,表示允许多行。设置为n(n>0)时,表示至多n行。如果需要你最多显示两行,多余的用省略号显示,那么就可以用如下的方法:
label.numberLines = 2;
label.lineBreakMode = NSLineBreakByTruncatingTail;
当然在UITableView计算cell高度时,最好预留出最多两行的高度。我的做法时,对NSString进行截断,计算部分字符串的大小即可。这个时候要注意,不同尺寸的iPhone每行最多显示的汉字跟字母、数字是不一样的,所以就需要多判断了。
以上,只是一个基础知识的记录,谈不上深入挖掘。不着急,小白会慢慢积累学习的!
Echo
2016.7.24