刚刚将我的 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
不保证跨版本甚至不同用途返回相同的底层字体。他的例子是露辛达格兰德。他似乎并不是说使用“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 混淆了。希望这会有所帮助!
最佳答案
这是一个 Apple 错误。它是在 iOS 7.0.3 中引入的,并且在 iOS 7.0.4 中尚未修复。它似乎已在 iOS 7.1 的开发者预览版中修复。以下是解决此问题的代码(由 Apple 在开发论坛中提供):
#import <CoreText/CoreText.h>
CGFloat size = 14;
UIFont *font = [UIFont fontWithName:@"HelveticaNeue-Italic" size:size];
if (font == nil && ([UIFontDescriptor class] != nil)) {
font = (__bridge_transfer UIFont*)CTFontCreateWithName(CFSTR("HelveticaNeue-Italic"), size, NULL);
}
还值得注意的是,在当前版本的 Xcode (5.0.1 (5A2053)) 中,此字体并未作为选项列在 Interface Builder 的字体下拉列表中。因此,如果您之前使用此字体配置了标签,您会注意到 ui 被混淆,并且标签最终在运行时被分配了一些其他字体和大小(参见下面的 ui screencap)。对于在 storyboards/xibs 中配置的标签,您需要在代码中重置字体。
供引用here是开发者论坛中对该问题的讨论。
关于objective-c - iOS 7.0.3 上的 "HelveticaNeue-Italic"发生了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19527962/