UILabel换行与多行文字显示处理

最近在项目中频繁遇到显示多少行文字的需求,有的需求是在什么情况下都只显示1行文字,有的需求是要求显示多少行文字由服务器端控制,有的需求是展示全部文字,有的需求是要最多展示5行文字,不过他们有一个共同的特点就是未显示全的文字用 … 来代替,遇到了这么多与文字显示行数有关的需求,因此我把UILabel处理显示行数的做了一下总结,下面来具体展示一下

需求1 只显示一行文字

只显示一行文字其实很好处理,在刚开始学习UILabel的使用时我们已经经常会遇到这种情况,那就是当UILabel的宽度(XXLabel.frame.size.width)不能完全容纳所有的文字时,文字就不会全部显示,在width之外的文字将不会显示,而用 … 来代替,所以说这是一种很好处理的情况。

你需要做的只是:

首先设置好UILabel的frame

把需要显示的文字赋值给UILabel的text属性

done

这里还有一种情况就是,当文字的长度其实是不能充满你一开始设置的frame的,而你需要使UILabel的长度适应文字的长度,这时你只需要把第三步的改为[XXLbel sizeTofit]即可,我在项目中遇到这种情况是在UILabel之后还需紧跟一个UIImage需要显示,这样设置可以使UILabel的长度根据文字来进行自适应,UIImage可以正常进行布局

需求2 需要显示全部文字

有时候我们会遇到这样一种情况,在某个ViewController中一些文字不能完全显示,我们点击显示全部,文字则会完全展开,大概就类似于微信朋友圈中点击查看全部,文字就完全显示,这样的情况怎么处理呢?

其实这种情况也比较好处理,我们只需让UILabel完全自适应文字即可

你需要做的是:

首先设置UILabel的frame(其实这里只需要设置UILabel的宽度即可)

然后设置UILabel的numberOfLines属性为0(XXLabel.numberOfLines = 0)

使UILabel自适应文字([XXLabel sizeToFit])

这里需要解释一下numberOfLines = 0,在UILabel.h文件中可以发现苹果是这样解释这个属性的:

这个属性是用来决定UILabel中文字有几行需要绘制,同时决定当UILabel的sizeToFit方法被调用时该怎么做。numberOfLines的默认值是1,即如果你不设置这个属性的话,UILabel默认只显示一行文字。接下来的一句话需要注意,当这个值被设置为0时代表没有限制,可以显示任意多行,根据你的文字来设置多少行,如果文字的高度超过一行的高度、或者UILabel的高度小于文字的高度,文字就会使用UIlabel的lineBreakMode的属性值来对文字进行删节

注意到上面一段文字中的最后一段话,我们发现如果文字的高度超过一行的高度、或者UILabel的高度小于文字的高度,文字就会使用UIlabel的lineBreakMode的属性值来对文字进行删节,因此如果你还希望使用…来代表未显示的字符的话,需要将UILabel的lineBreakMode属性设置为NSLineBreakByTruncatingTail

lineBreakMode的类型是一个枚举值,类型是NSLineBreakMode,在这里贴出NSLineBreakMode的定义,可以根据需要使用不同的枚举值

typedef NS_ENUM(NSInteger, NSLineBreakMode) {

NSLineBreakByWordWrapping = 0,  // Wrap at word boundaries, default

NSLineBreakByCharWrapping,    // Wrap at character boundaries

NSLineBreakByClipping,        // Simply clip

NSLineBreakByTruncatingHead,    // Truncate at head of line: "...wxyz"

NSLineBreakByTruncatingTail,    // Truncate at tail of line: "abcd..."

NSLineBreakByTruncatingMiddle  // Truncate middle of line:  "ab...yz"

} NS_ENUM_AVAILABLE(10_0, 6_0);

需求3 服务器端控制显示多少行文字

遇到这种需求的时候不要慌,首先需要跟PM详细询问,是服务器控制某个页面所有的UILabel都使用一个值来控制行数显示还是针对每一个UILabel都有一个相应的值来进行控制行数显示。其实这个显示行数的没有必要由服务器来控制,客户端完全可以做这样的事,用不到服务器,服务器只要把需要的显示的文字传回来就行了,这种情况也是因为PM对技术不太属性导致的,所以一定要与PM说清楚这一点,不然有可能你最终写出来的代码需要重写。

好了,现在我们假定PM一定要服务器控制显示多少行,我们也有相应的做法:

设置UILabel的frame(不能只设置宽度,高度也要设置,原因在下面会说到)

从服务器返回的值中解析出需显示的行数

将UILabel的numberOfLines设置为第2步中的行数

对行数进行判断,如果行数为1,就不用sizeToFit(因为numberOfLines = 0时,调用sizeToFit就不会显示…),否则,需要调用[XXLabel sizeToFit]

搞定

需求4 最多显示5行,文字不够5行的有多少行显示多少行

这种需求比较常见,比如说微信朋友圈中,超过多少行就会显示收起按钮,剩下的文字应…来代替,没超过那个行数就有多少行显示多少行,有可能在做社区啊、贴吧啊之类的地方会遇到这样的需求

遇到这样的需求也不要慌,也有相应的解决办法

同样是设置UILabel的Frame(不用设置高度)

计算出完全展示文字需要多少高度,这里需要使用NSString的boundingRectWithSize:options:attributes:context:方法,将size的宽度使用UILabel.frame.size.width,高度可以设置一个很大的值(10000),如果你对计算文字显示高度的选项有需求可以将指定的NSStringDrawingOptions类型的值传入option参数(注意这些值可以同时使用),如果你对文字的属性有要求可以将相应的属性传入attribute参数,context参数一般可以传nil(因为我发现传nil就能完成任务,对context参数没有详细了解,挖个坑,以后回来补上)

使用UIFont的lineHeight属性得到每一行的高度

使用第2步中得到的文字高度除以每一行的高度即可得到文字的行数

对第4步中得到的行数进行判断,如果 行数 <= 5,UILabel的numberOfLines属性设置为0,否则UILabel的numberOfLines属性设置为5

调用[XXUILabel sizeToFit]方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • UILabel是一个常用的控件,它的属性设置的方法在纯代码中经常使用。在storyboard中,使用UILabel...
    坤哥lqk阅读 844评论 0 2
  • 一、简介 <<UILabel类实现一个只读的文本视图。您可以使用这个类的静态文本,如你可能会使用它来识别你的用户界...
    无邪8阅读 1,238评论 0 0
  • 对于UILabel其实我觉得并没有太多的要素需要仔细去弄明白的,因为至今为止,我所了解到的label属性不外乎就是...
    懒惰的习惯阅读 567评论 0 0
  • 概述在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似...
    liudhkk阅读 8,978评论 3 38
  • 我在睡梦中被突如其来的大雨吵醒,今晩上雨声,透着窗户的外音,雨点敲打噪音,让人心腹气燥!交杂地雷电声,让我...
    至尊王阅读 203评论 0 3