今天晚上做了个关于富文本的小练习,期中遇到了一个小bug,但是就是这个bug让我费了好久才找到原因。下面结合代码来说明这个bug为什么会出现(知道原因当然就知道怎么解决了。。。哈哈哈)。
本文章代码由xcode7.2,在iOS9.2环境下运行
- 这是出现bug的代码
NSMutableAttributedString *mAttStr = [[NSMutableAttributedString alloc] initWithString:(NSString *)mString];
UILabel *commentLabel = [[UILabel alloc] initWithFrame:commentLabel1.frame];
commentLabel.numberOfLines = 0;
NSRange fromRange = [mString rangeOfString:fromStr];
NSRange toRange = [mString rangeOfString:toStr];
[mAttStr addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:fromRange];
[mAttStr addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:toRange];
commentLabel.attributedText = mAttStr;
运行结果如下图所示
有人说了,应该加上换行模式。但是UILabel的默认换行模式就是NSLineBreakByWordWrapping。然而,经过测试,即便加上换行模式也无法实现换行。
后来我将此问题暂搁,根据效果图设置其他属性,当我在commentLabel.numberOfLines = 0;
下加了一行代码commentLabel.font = [UIFont systemFontOfSize:13.0];
后,换行效果奇迹的实现了。
如下图所示:
经过分析,UIlabel文本换行跟字体大小有关,下面为从网上查找的资料:
- 获取UILabel的frame大小
- 获取UILabel的字体大小
- 获取UILabel的文本内容
- 根据上面的3部分数据,计算文本显示区域大小
- 根据4计算的大小,实时改变UILabel的frame
至此,我对我的bug做了总结:
首先,我的label的大小是确定了的;
其次,我并没有对UIlabel的字体进行明确设置,而UIlabel的默认中文字体大小是17,如果换行的话,会超过label的大小。
总结
经过自己的测试和网上的资料,关于UIlabel的换行,我总结如下:
- 首先,要设置
commentLabel.numberOfLines = 0;
- 其次要确定UIlabel的字体大小
- 最终要保证UIlabel的大小能够完全显示换行后的文本。