将UIFont转换为CTFontRef并在Retina显示器上添加斜体

9

我有一个自定义的UILabel子类,使用CoreText进行自定义绘制。我过去通过访问标签上设置的字体属性来绘制字符串,使用UIFont。我还向字体添加了一些特性。这是它的样子:

UIFont* font = [self font];
CTFontRef ref = CTFontCreateWithName((CFStringRef)[font name], [font pointSize], NULL);
CTFontRef italicFont = CTFontCreateCopyWithSymbolicTraits(ref, [font pointSize], NULL, kCTFontItalicTrait, kCTFontItalicTrait);

这在新 iPad 推出其视网膜显示器前一直正常工作。当我执行 CTFontCreateCopyWithSymbolicTraits 调用时,它会产生一个 nil 返回值。我发现在这些新设备上,[font name] 返回".HelveticaNeueUI"。虽然 CTFontCreateWithName 与此私有字体名称似乎可以正常工作,但 CTFontCreateCopyWithSymbolicTraits 不行。然而,如果我使用 [UIFont italicSystemFontOfSize:[font pointSize]] 创建一个斜体字体,则会创建一个斜体字体,其中 [font name] 仍返回“.HelveticaNeueUI”。

我应该如何将我的 UIFont 转换为 CTFontRef,以便我仍然可以在视网膜和非视网膜显示器上对我的 CTFontRef 应用新的特性?

3个回答

14

虽然有点过时,但对于仍然关心的人:

这是因为新的Retina设备(iPhone 4,iPad)中使用的新Neue Helvetica系统字体没有斜体版本。并非每种字体都有粗体和 / 或斜体变体。
因此,如果您需要斜体文本,则需要使用其他字体,例如旧Helvetica。

CTFontRef ref = CTFontCreateWithName((CFStringRef)@"Helvetica", 12, NULL);
CTFontRef italicFont = CTFontCreateCopyWithSymbolicTraits(ref, 12, NULL, kCTFontItalicTrait, kCTFontItalicTrait);

哈。欢迎来到 Core Text。 - Sam Soffes

3

如果您使用ARC,将UIFont/NSFont转换为CTFontRef非常简单。

UIFont:

UIFont *uiFont = [UIFont fontWithName:@"Helvetica" size:10];
CTFontRef ctFont = (__bridge CTFontRef)uiFont;

NSFont:

NSFont *nsFont = [NSFont fontWithName:@"Helvetica" size:10];
CTFontRef ctFont = (__bridge CTFontRef)nsFont;

0

使用这种方式,将UIFont转换为CTFontRef

UIFont *uiFont = [UIFont fontWithName:@"Helvetica" size:10];
CTFontRef ctFont = (__bridge CTFontRef)uiFont;

我们需要释放ctFont吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接