ibireme / YYText

Powerful text framework for iOS to display and edit rich text.
MIT License
8.86k stars 1.7k forks source link

YYLabel 修改行间距问题 #338

Closed NSaylor closed 8 years ago

NSaylor commented 8 years ago

涉及自定义表情的问题 在未设置linePositionModifier 时,自行设置属性文本的行间距等属性。最终发现有表情的那一行会高出一些,导致文本整体不统一。

//设置评论label NSMutableAttributedString *contentAtr = [[NSMutableAttributedString alloc]initWithString:strContent]; //设置文本属性 contentAtr.font = [UIFont fontWithName:DP_FONTNAME size:16]; contentAtr.color = [UIColor redcolor]; //行间距 contentAtr.lineSpacing = adoptLineSpacing(2.5); //字间距 [contentAtr addAttribute:NSKernAttributeName value:[NSNumber numberWithFloat:-0.5] range:NSMakeRange(0, strContent.length)];

self.lblContent.attributedText = contentAtr;

self.lblContent.frame =CGRectMake(10, 10, 200, self.lblContent.textLayout.textBoundingSize.height); //比如这里获得的高度为 137 --- self.lblContent.textLayout.textBoundingSize.height

为了解决上面间距不统一的问题,我设置了 self.lblContent.linePositionModifier 这个属性 取值为当前字号(16) + 所需间距 这样设置以后,有两个问题 1.当我设置的值小于 22 或者更小时 self.lblContent.textLayout.textBoundingSize.height 这个值会变为 118 导致我的Label有一部分内容是不会显示的

2.当设置的值大于22 时 self.lblContent.textLayout.textBoundingSize.height 这个值会变为 137 (22) 这是一个经验值,但不能满足我需要设置指定间距的要求。

再次尝试了文档中 的如下部分: // 完全控制: YYTextLinePositionSimpleModifier *modifier = [YYTextLinePositionSimpleModifier new]; modifier.fixedLineHeight = 24;

YYTextContainer *container = [YYTextContainer new]; container.size = CGSizeMake(100, CGFLOAT_MAX); container.linePositionModifier = modifier;

YYTextLayout layout = [YYTextLayout layoutWithContainer:container text:text]; YYLabel label = [YYLabel new]; label.size = layout.textBoundingSize;

/*_下面这句话会引发一些问题,高度是能够正确获得的,但表情都被显示成了编码_**/ label.textLayout = layout;

另外根据实际情况,YYTextView 不会出现这个问题。但唯一的区别是,SizeToFit 方法对YYTextView是生效的,对YYLabel无效。

希望能够给出一些思路,谢谢~

ibireme commented 8 years ago

在 [YYTextLayout layoutWithContainer:container text:text]; 这一句之前,需要把文本解析成表情。 如果用到了 textParser,那需要手动调用解析一下。

NSaylor commented 8 years ago

按照你说的 并没有解决这个问题,仔细的看了下。
label 已经设置了表情解析 纯文本 最后计算出来的高度是没问题的 纯表情 最后计算出来的高度不正确 有部分表情不会显示出来

但如果 不设置linePositionModifier (纯表情文本)表情会全部显示,只是无法统一控制行间距了。

NSaylor commented 8 years ago

已经正确解决该问题,谢谢指教。
其实之前没有理解手动解析的含义~

NorthDogLi commented 7 years ago

受益匪浅