我可以使用转义的换行符(NSAttributedString
)创建多行@"\n"
。使用iOS 7,我现在可以在UIImage
内部嵌入属性字符串(通过NSTextAttachment
)。
我注意到每当我将attributedText
的{{1}}设置为带有嵌入图像的多行属性字符串时,实际显示的行数反向与标签的高度成比例。例如,当标签的高度为80时,会出现两条线;当高度大约为100时,只出现第二条线;当高度约为130时,什么都没有出现。
尝试将多个UILabel并排放置在UILabel
内并使标签与单元格高度(垂直)一起增长时出现此问题。
任何人都可以解释为什么会这样吗?有没有人知道不涉及使UILabel变小的解决方法吗?
示例代码:
UITableViewCell
...将其放在“单一视图应用程序”的默认视图控制器中。 (您可以选择自己的图像。)
答案 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的全部来源,所以失去它并不是那么可怕。