我刚把iPod Touch升级到iOS 7.0.3,但"HelveticaNeue-Italic"似乎消失了。当我在手机上查询时:
[UIFont fontNamesForFamilyName:@"Helvetica Neue"]
我得到了以下字体名称(13个):
HelveticaNeue-BoldItalic,
HelveticaNeue-Light,
HelveticaNeue-UltraLightItalic,
HelveticaNeue-CondensedBold,
HelveticaNeue-MediumItalic,
HelveticaNeue-Thin,
HelveticaNeue-Medium,
HelveticaNeue-ThinItalic,
HelveticaNeue-LightItalic,
HelveticaNeue-UltraLight,
HelveticaNeue-Bold,
HelveticaNeue,
HelveticaNeue-CondensedBlack
当我在模拟器中运行相同的查询时,我得到了(14):
HelveticaNeue-BoldItalic,
HelveticaNeue-Light,
**HelveticaNeue-Italic,**
HelveticaNeue-UltraLightItalic,
HelveticaNeue-CondensedBold,
HelveticaNeue-MediumItalic,
HelveticaNeue-Thin,
HelveticaNeue-Medium,
HelveticaNeue-Thin_Italic,
HelveticaNeue-LightItalic,
HelveticaNeue-UltraLight,
HelveticaNeue-Bold,
HelveticaNeue,
HelveticaNeue-CondensedBlack
还有人看到这个吗?
---- 新信息 ----
我回到了 WWDC 2013 视频“Using Font with Text Kit”,有趣的部分从12:22 开始。演讲者谈到了 OS X 中的“MetaFonts”作为一个例子。他说,在像下面这样的调用下使用的字体:
+ (NSFont *)messageFontOfSize:(CGFloat)fontSize
不能保证在不同版本或不同用途中返回相同的底层字体。他举的例子是Lucida Grande。他似乎并没有说使用“HelveticaNeue-Italic”可能会在不同版本中消失。
因此,我在iOS 7中进行了一项实验。我使用以下代码创建了我的字体:
UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithName:@"Helvetica Neue" size:16.0];
UIFontDescriptor *symbolicFontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];
UIFont *fontWithDescriptor = [UIFont fontWithDescriptor:symbolicFontDescriptor size:16.0];
使用fontWithDescriptor获得了有效的UIFont,然后我使用以下代码查询字体的fontName:
[fontWithDescriptor fontName]
我回到了家中,打开了我的电脑。
HelveticaNeue-Italic
究竟怎么回事呢???
所以,一个可能的答案是上面的代码,回答了7.0.3的问题。
---- 进一步改进 ----
虽然上面的解决方案有效,但我认为它并不正式正确。我已经转而使用以下解决方案。
UIFontDescriptor *fontDescriptor = [[UIFontDescriptor alloc] init];
UIFontDescriptor *fontDescriptorForHelveticaNeue = [fontDescriptor fontDescriptorWithFamily:@"Helvetica Neue"];
UIFontDescriptor *symbolicFontDescriptor = [fontDescriptorForHelveticaNeue fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];
textFont = [UIFont fontWithDescriptor:symbolicFontDescriptor size:textFontPointSize];
看起来这个做了所有正确的事情。我之前尝试了另一个字体系列的方法,似乎在fontName和fontFamily上混淆了。