TableView & CelliOS DeveloperiOS开发资料收集区

由NSString估算UILabel的高度

2016-07-24  本文已影响252人  337b94dc718f

一.项目的实际需要

在刚完成的两个项目中,我都是负责封装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

上一篇下一篇

猜你喜欢

热点阅读