iOS 7.0.3上的“ HelveticaNeue-Italic”发生了什么


100

刚刚将iPod touch升级到iOS 7.0.3,“ HelveticaNeue-Italic”似乎已经消失了。当我在电话上查询时:

[UIFont fontNamesForFamilyName:@"Helvetica Neue"]

我得到以下fontNames(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视频“使用带有文本工具包的字体”,有趣的部分开始于12:22。演示者以OS X中的“ MetaFonts”为例。他说的是通话中的字体如下:

+ (NSFont *)messageFontOfSize:(CGFloat)fontSize

不能保证在不同版本甚至不同用途下都返回相同的基础字体。他的例子是露辛达·格兰德(Lucinda 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混淆了。希望这可以帮助!


我也看到了 不知道发生了什么,但这只是一个回归。
ipodishima

有趣的是,iOS 7.0.3上的Pages显示Helvetica Neue Italic:i.stack.imgur.com/xpJKl.png
Leo Natan

所以看来您用自己的问题和研究回答了我的问题,使用字体描述符确实在我的7.0.3 iPhone上显示了斜体字体。
里克·范德·林德

这也是iOS 7.0.4中的问题
s.ka

Answers:


31

这是一个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的Font下拉列表中作为选项列出。因此,如果您之前使用此字体配置了标签,则会注意到ui混淆了,并且标签在运行时最终被分配了其他字体和大小(请参见下面的ui屏幕截图)。对于在情节提要/ xib中配置的标签,您将需要在代码中重置字体。

仅供参考这里是问题的在开发论坛的讨论。

在此处输入图片说明


您说您用其他东西代替了所有用途。您用什么取代了它?我们注意到,如果在XIB文件与HelveticaNeue-MediumItalic取代它,我们得到了在iOS 6不正确的结果和更早版本,因为该字体似乎在iOS的7引入了
GBegen

我用HelveticaNeue-LightItalic代替了它。不确定何时引入。我的应用是iOS7 +
Mike Vosseller

7

这是iOS 7.0.3中的错误。

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

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

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


4

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


1
仅供参考:我刚刚测试过,但该错误仍存在于iOS 7.0.4中。
大卫·拉里

3

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


这可能是解决此问题的最干净的方法。如果需要iOS 6支持,则可以先尝试运行fontWithName:size:,如果结果为nil,请运行italicSystemFontOfSize:,它应始终返回内容,并至少避免崩溃。
SaltyNuts 2013年

2

我目前找不到该会话,但是他们说了一些您不能依靠iOS7上可用字体的内容。它们甚至可以在您应用程序的生命周期内进行更改。这基本上意味着:当您在应用程序中指定字体时,您就陷入困境,而是使用字体描述符或首选字体!


2
我可以找到最接近的匹配项是asciiwwdc.com/2013/sessions/223,但看起来它们是指可下载的字体,而不是系统提供的字体。
坎贝尔希尔顿酒店

请参阅上面的新信息。我认为演示者在说的是,您不能指望将“ MetaFonts”映射到跨版本甚至使用的相同基础字体。我不认为他是在说“ HelveticaNeue-Italic”之类的东西甚至有可能消失的可能性。
Scott Sarnikowski

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提出了一个错误,也有很多。在此之前,这种解决方案似乎一直有效...


1

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


1
我得到了同样的回应。希望他们修复它。
Scott Sarnikowski


0

我遇到过一次崩溃,以前只是在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 

-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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.