objective-c - iOS 7.0.3 上的 "HelveticaNeue-Italic"发

刚刚将我的 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/

相关文章:

ios - UICollectionView 当前可见单元格索引

ios - 如何将度数转换为弧度?

ios - 键盘出现时如何滚动 UIScrollView?

objective-c - libxml/tree.h 没有这样的文件或目录

ios - 快速创建和播放声音

ios - UIAlertView 首先弃用 IOS 9

objective-c - NSString 带\n 或换行符

iphone - 即使图像较小,如何使 UITableViewCell 的 ImageView 成为

ios - 如何让 UILabel 显示轮廓文本?

objective-c - 如何将 int 转换为 NSString?