由NSString估算UILabel的高度

作者: 337b94dc718f | 来源:发表于2016-07-24 22:27 被阅读252次

    一.项目的实际需要

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

    相关文章

      网友评论

        本文标题:由NSString估算UILabel的高度

        本文链接:https://www.haomeiwen.com/subject/zfkgjttx.html