我正在使用TTTAttributedLabel(使用CoreText)而不是UILabel来加粗某些部分。它工作得很好,但文字看起来不一样。它看起来像是使用不同的字体。我把它设置为相同的字体(Helvetica),但一个是CTFont,一个是UIFont。为什么他们看起来不一样?
UIFont
:[UIFont systemFontOfSize:15]
CTFont
:CTFontCreateWithName((__bridge CFStringRef)[UIFont systemFontOfSize:15].fontName, 15, NULL)
UILabel截图:
CoreText屏幕截图:
“p”和“promenade”中的“o”是最容易看到字体看起来不一样的部分。 CoreText版本中的字母更圆。
答案 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之间获得相同的测量结果。它们使用不同的布局和间距代码。