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

jas*_*ori 8 objective-c core-text ios

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

  • 这是UIFontUILabel的:[UIFont systemFontOfSize:15]
  • 这是CTFont针对CoreText的:CTFontCreateWithName((__bridge CFStringRef)[UIFont systemFontOfSize:15].fontName, 15, NULL)

UILabel截图:

在此输入图像描述

CoreText屏幕截图:

在此输入图像描述

"散步"中的"p"和"o"是最容易看到字体看起来不一样的部分.CoreText版本中的字母更圆.

jar*_*jar 8

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

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


Dan*_*Dan 7

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

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

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

在iOS 5.1上测试过.