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

转载自: https://blog.csdn.net/shorewb/article/details/52081173

需求1 只显示一行文字

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

你需要做的只是:

  1. 首先设置好UILabel的frame
  2. 把需要显示的文字赋值给UILabel的text属性
  3. done

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

需求2 需要显示全部文字

有时候我们会遇到这样一种情况,在某个ViewController中一些文字不能完全显示,我们点击显示全部,文字则会完全展开,大概就类似于微信朋友圈中点击查看全部,文字就完全显示,这样的情况怎么处理呢? 
其实这种情况也比较好处理,我们只需让UILabel完全自适应文字即可

你需要做的是:

  1. 首先设置UILabel的frame(其实这里只需要设置UILabel的宽度即可)
  2. 然后设置UILabel的numberOfLines属性为0(XXLabel.numberOfLines = 0)
  3. 使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一定要服务器控制显示多少行,我们也有相应的做法:

  1. 设置UILabel的frame(不能只设置宽度,高度也要设置,原因在下面会说到)
  2. 从服务器返回的值中解析出需显示的行数
  3. 将UILabel的numberOfLines设置为第2步中的行数
  4. 对行数进行判断,如果行数为1,就不用sizeToFit(因为numberOfLines = 0时,调用sizeToFit就不会显示…),否则,需要调用[XXLabel sizeToFit]

搞定

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

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

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

  1. 同样是设置UILabel的Frame(不用设置高度)
  2. 计算出完全展示文字需要多少高度,这里需要使用NSString的boundingRectWithSize:options:attributes:context:方法,将size的宽度使用UILabel.frame.size.width,高度可以设置一个很大的值(10000),如果你对计算文字显示高度的选项有需求可以将指定的NSStringDrawingOptions类型的值传入option参数(注意这些值可以同时使用),如果你对文字的属性有要求可以将相应的属性传入attribute参数,context参数一般可以传nil(因为我发现传nil就能完成任务,对context参数没有详细了解,挖个坑,以后回来补上)
  3. 使用UIFont的lineHeight属性得到每一行的高度
  4. 使用第2步中得到的文字高度除以每一行的高度即可得到文字的行数
  5. 对第4步中得到的行数进行判断,如果 行数 <= 5,UILabel的numberOfLines属性设置为0,否则UILabel的numberOfLines属性设置为5
  6. 调用[XXUILabel sizeToFit]方法

搞定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值