101

刚刚将我的 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 混淆了。希望这可以帮助!

4

10 回答 10

31

这是一个苹果错误。它是在 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 中配置的标签,您需要在代码中重置字体。

供参考是开发论坛中对该问题的讨论。

在此处输入图像描述

于 2013-10-24T16:22:29.793 回答
7

这是 iOS 7.0.3 中的一个错误。

如果您明确使用 HelveticaNeue-Italic,则可以使用以下解决方法创建它:

UIFont* font = (__bridge_transfer UIFont*)CTFontCreateWithName(CFSTR("HelveticaNeue-Italic"), fontSize, NULL);

但请注意,此解决方法适用于 iOS 7;它不能部署到 iOS 6(因为在 iOS 6 上CTFontRefUIFont没有免费桥接)。但是,在 iOS 6 上,您可以只使用常规字体查找代码。

于 2013-10-31T02:21:11.337 回答
4

我相信这是一个错误。我已将其提交给 Apple。对我来说可悲的是,我的应用程序现在崩溃了。该字体用于我正在使用的第 3 方库中。Twitter 上的许多人都在报告问题。

于 2013-10-23T15:01:20.467 回答
3

如果您正在动态访问斜体字体,而不是按名称访问字体, [UIFont fontWithName:@"HelveticaNeue-Italic" size:15.0f][UIFont italicSystemFontOfSize:15.0f]对我来说很好用。

于 2013-11-01T08:46:26.167 回答
2

我目前没有找到该会话,但他们说您不能再依赖 iOS7 上可用的字体了。它们甚至可以在您的应用程序的生命周期内发生变化。这基本上意味着:当您在应用程序中指定字体时,您就搞砸了,请改用字体描述符或首选字体!

于 2013-10-23T15:00:36.847 回答
1

我向 Apple 提交的错误报告已被标记为“已关闭为重复”。我希望这意味着他们确实认为这是一个错误。但是,iOS 7.0.4 并未修复该错误。

于 2013-11-14T20:14:47.247 回答
1

我遇到了同样的崩溃,它曾经只在 iOS 7.0.3 和 7.0.4 中崩溃,并且在所有其他版本中都能完美运行。经过这么多调查,我才知道@"HelveticaNeue-Italic" 在 iOS 7.0.3 和 7.0.4 版本中不可用,所以我曾经在这些版本中遇到过崩溃。

我已经用下面的代码解决了这个问题,这可能对有需要的人有帮助。

self.headerFont = [UIFont fontWithName:@"HelveticaNeue-Italic" size:16.0f];
if (self.headerFont == nil) {
    self.headerFont = [UIFont fontWithName:@"HelveticaNeue" size:16.0f];
}

崩溃日志是:

[__NSCFConstantString pointSize]: unrecognized selector sent to instance 
于 2014-08-01T07:06:59.840 回答
1

我找到了另一种似乎可行的解决方案。我退出了一个呼叫

[[UIFont italicSystemFontOfSize:12.0] fontName]

查看正在使用的实际系统斜体字体是什么,它返回“.HelveticaNeueInterface-ItalicM3”。一个简单的测试表明,使用

[UIFont fontWithName:@".HelveticaNeueInterface-ItalicM3" size:12.0]

作品!从视觉上比较它们,上述调用返回的字体似乎与原始的“HelveticaNeue-Italic”字体完全相同。

这个问题几乎可以肯定是一个错误...... Helvetica Neue 是 iOS 7 中的默认字体,因此该系列中的字体不应该丢失。在 Xcode v.5.0 中一切正常,但在升级到 5.0.1 后立即开始出现此问题。我已经向 Apple 提交了一个错误,并指出了这一点。在那之前,这个解决方案似乎有效......

于 2013-10-30T18:50:12.780 回答
1

该错误似乎已在 iOS 7.1 beta 1 中修复。[UIFont fontWithName:@"HelveticaNeue-Italic" size:size];返回字体。

于 2013-11-19T23:29:25.823 回答
-1

由于没有人提到 UIWebView 中的 HelveticaNeue 斜体支持,我想我会分享我的发现。

从 7.0.6 开始,UIWebView 中仍然缺少常规斜体,并且似乎在同一个系列中回退到 UltraLightItalic。当它紧挨常规重量非斜体 HelveticaNeue 文本时,这看起来有点奇怪,因为它要轻得多。

我的解决方法是使用普通的 Helvetica 而不是 HelveticaNeue,但仅用于斜体。因此,如果您的 CSS 看起来像这样:

.myCssClass {
    font-family:HelveticaNeue;
    /* etc, etc */
}

...您将添加另外两个类来覆盖<i><em>

.myCssClass i  { font-family:Helvetica; }
.myCssClass em { font-family:Helvetica; }

常规的 Helvetica 斜体字体看起来不错,我认为没有人会注意到它不是 HelveticaNeue。

于 2014-02-26T22:14:29.167 回答