为什么使用CoreText绘图与UILabel不同?

时间:2011-11-16 20:39:28

标签: objective-c ios core-text

我正在使用TTTAttributedLabel(使用CoreText)而不是UILabel来加粗某些部分。它工作得很好,但文字看起来不一样。它看起来像是使用不同的字体。我把它设置为相同的字体(Helvetica),但一个是CTFont,一个是UIFont。为什么他们看起来不一样?

  • 以下是UILabel的UIFont[UIFont systemFontOfSize:15]
  • 以下是CoreText的CTFontCTFontCreateWithName((__bridge CFStringRef)[UIFont systemFontOfSize:15].fontName, 15, NULL)

UILabel截图:

enter image description here

CoreText屏幕截图:

enter image description here

“p”和“promenade”中的“o”是最容易看到字体看起来不一样的部分。 CoreText版本中的字母更圆。

3 个答案:

答案 0 :(得分:8)

UILabel使用WebKit样式的文本呈现,它在准确性方面采用快捷方式来提高绘图性能。 CoreText(最初来自OS X)采用相反的方式,以牺牲性能为代价,尽可能精确地呈现。

对于iOS应用程序,仅为最明显的关键UI(例如标题)保留CoreText,并且可以在其中缓存渲染的输出。

答案 1 :(得分:7)

我花了一些时间试图解决这个问题,我想我已经得到了它。从我到目前为止测试的结果来看,通过将字距设置为零,您的CoreText渲染看起来与您在UILabel,UITextView等上看到的渲染相同:

NSNumber *kern = [NSNumber numberWithFloat:0];
NSRange full = NSMakeRange(0, [attributedText string].length);
[attributedText addAttribute:(id)kCTKernAttributeName value:kern range:full];

这是非常奇怪的行为,我不能说我知道它为什么会发生,但这正是Apple似乎在做的事情。 (它实际上增加了某些地方的间距,比如在'Te'之间。)

在iOS 5.1上测试。

答案 2 :(得分:3)

我很确定这是因为Core Text具有更高级的渲染(字距调整和间距改进,等等)。对不起,我无法挖掘任何文档证明这一点,但这是我从中得到的一般感觉。

最重要的是,你不能指望在Core Text和UILabel以及其他UIKit API之间获得相同的测量结果。它们使用不同的布局和间距代码。