到目前为止,我的所有研究似乎表明不可能准确地做到这一点.我在一开始就可以选择的唯一两个选项是:
a)使用CATextLayer的布局管理器 - 从4.0版开始在iOS上不可用
b)使用sizeWithFont:constrainedToSize:lineBreakMode:并根据此处返回的大小调整CATextLayer的帧.
选项(b)是最简单的方法,应该有效.毕竟,它与UILabels完美配合.但是当我将相同的帧计算应用于CATextLayer时,框架总是比预期或需要的要大一些.
事实证明,CATextLayers和UILabels中的行间距(对于相同的字体和大小)是不同的.因此,sizeWithFont(其行间距计算将与UILabels的行间距计算匹配)不会返回CATextLayers的预期大小.
通过使用UILabel打印相同的文本,与CATextLayer相比,并比较结果,进一步证明了这一点.第一行中的文本完全重叠(它是相同的字体),但CATextLayer中的行间距比UILabel略短.(对不起,我现在无法上传截图,因为我已经包含机密数据,我目前没有时间制作一个示例项目来获取干净的截图.我稍后会为后人上传它们,当时我有时间)
这是一个奇怪的区别,但我认为可以通过为我在那里使用的NSAttributedString指定适当的属性来调整CATextLayer中的间距,但似乎并非如此.查看CFStringAttributes.h我找不到可能与行间距相关的单个属性.
底线:
因此,在需要适合其文本的图层的情况下,似乎无法在iOS上使用CATextLayer.我是对的,还是我错过了什么?
PS:
我想使用CATextLayer和NSAttributedString的原因是因为要显示的字符串在不同点上的颜色不同.我想我必须一如既往地回去手工绘制字符串......当然总是可以选择从sizeWithFont中获取结果以获得正确的行高.
滥用"代码"标签稍微有点使帖子更具可读性.
我无法使用'CATextLayer'标记帖子 - 令人惊讶的是目前还没有这样的标签.如果有足够声誉的人碰到这篇文章,请相应标记.