嵌入NSTextAttachment时,高UILabel中缺少的行

时间:2013-10-08 16:26:51

标签: ios ios7 uilabel nstextattachment textkit

我可以使用转义的换行符(NSAttributedString)创建多行@"\n"。使用iOS 7,我现在可以在UIImage内部嵌入属性字符串(通过NSTextAttachment)。

我注意到每当我将attributedText的{​​{1}}设置为带有嵌入图像的多行属性字符串时,实际显示的行数反向与标签的高度成比例。例如,当标签的高度为80时,会出现两条线;当高度大约为100时,只出现第二条线;当高度约为130时,什么都没有出现。

尝试将多个UILabel并排放置在UILabel内并使标签与单元格高度(垂直)一起增长时出现此问题。

任何人都可以解释为什么会这样吗?有没有人知道不涉及使UILabel变小的解决方法吗?


示例代码:

UITableViewCell

...将其放在“单一视图应用程序”的默认视图控制器中。 (您可以选择自己的图像。)

4 个答案:

答案 0 :(得分:21)

它与NSTextAttachment无关。就像到目前为止发布的iOS 7中一样,UILabel并不擅长绘制属性字符串。带有一些下划线和居中的段落样式的简单属性字符串将在UILabel中显示空白或部分空白;相同的属性字符串在UITextView中绘制得很好。

因此,现在的一个解决方案是:使用UITextView代替。这实际上是一个非常好的解决方案,因为在iOS 7中,UITextView只是Text Kit堆栈的包装器。因此它以直接的方式绘制属性字符串。它不受先前iOS版本中与Web Kit的底层关系的阻碍。

另一方面,我也找到了这个UILabel bug的解决方法;你必须弄乱标签和字符串的行数,以便将文本卡在标签的顶部:请参阅我的答案 - https://stackoverflow.com/a/19409962/341994

或者您可以等待Apple修复错误并保持手指交叉。编辑:在iOS 7.1中,似乎修复错误,并且不需要解决方法。

答案 1 :(得分:2)

UILabel似乎是一个错误。使用UITextView而不是UILabel时,相同的代码可以正常工作(UITextView的默认字体大小不同,所以我在不同的高度测试了它。)

答案 2 :(得分:0)

您是否尝试使用boundingRectWithSize方法获取文本的实际高度:

NSAttributedString *text;
CGFloat width = 200;
CGRect rect = [text boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil];
CGFloat height = rect.size.height;

答案 3 :(得分:0)

我找到了这个bug的另一个解决方法,这与我以前的答案有很大的不同,我将其作为另一个答案提供:让标签设置自己的高度。

在这段代码中,我从具有固定宽度约束的标签中删除高度约束,并将其替换为大于高度的约束(我确信还有其他方法可以实现相同的结果):

[self.lab removeConstraint:self.labelHeight];
[self.lab addConstraint:
 [NSLayoutConstraint constraintWithItem:self.lab 
 attribute:NSLayoutAttributeHeight 
 relatedBy:NSLayoutRelationGreaterThanOrEqual 
 toItem:nil attribute:0 multiplier:1 constant:20]];

该标签正确显示我抛出的每个属性字符串!当然,你失去了字符串的自动垂直居中,但这是bug的全部来源,所以失去它并不是那么可怕。