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

刚将我的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 2013video“使用字体和文本工具包”,有趣的部分从12:22开始。 主讲人以OS X中的“MetaFonts”为例。 他所说的是,像下面的调用字体:

 + (NSFont *)messageFontOfSize:(CGFloat)fontSize 

不能保证在不同的版本或甚至不同的用途上返回相同的底层字体。 他的例子是Lucinda Grande。 他似乎没有说使用“HelveticaNeue-Italic”可以从版本到版本。

所以我在iOS 7中构build了一个实验。我用下面的代码创build了我的字体:

 UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithName:@"Helvetica Neue" size:16.0]; UIFontDescriptor *symbolicFontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic]; UIFont *fontWithDescriptor = [UIFont fontWithDescriptor:symbolicFontDescriptor size:16.0]; 

我没有得到一个有效的UIFont为fontWithDescriptor和当我查询字体为fontName:

 [fontWithDescriptor fontName] 

我回来了…

 HelveticaNeue-Italic 

去搞清楚???

所以7.0.3的一个可能的答案似乎是上面的代码。

—-进一步调整—-

虽然上面的解决scheme是有效的,但我认为这是正确的。 我已经切换到以下解决scheme

  UIFontDescriptor *fontDescriptor = [[UIFontDescriptor alloc] init]; UIFontDescriptor *fontDescriptorForHelveticaNeue = [fontDescriptor fontDescriptorWithFamily:@"Helvetica Neue"]; UIFontDescriptor *symbolicFontDescriptor = [fontDescriptorForHelveticaNeue fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic]; textFont = [UIFont fontWithDescriptor:symbolicFontDescriptor size:textFontPointSize]; 

这似乎是做所有正确的事情。 我尝试了以前的方法与另一个字体家族,它似乎与fontName和fontFamily混淆。 希望这可以帮助!

这是一个苹果的错误。 它是在iOS 7.0.3中引入的,从iOS 7.0.4开始尚未修复。 它似乎在iOS 7.1的开发者预览中得到了修复。 这里是代码(在开发论坛中由苹果公司提供)来解决这个问题:

 #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的字体下拉列表中没有列出。 所以,如果你以前用这种字体configuration了一个标签,你会注意到UI是混淆的,标签在运行时被分配了一些其他的字体和大小(参见下面的UI屏幕截图)。 对于故事板/ xib中configuration的标签,您需要重置代码中的字体。

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

在这里输入图像说明

这是iOS 7.0.3中的一个错误。

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

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

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

我相信这是一个错误。 我已经提交给苹果公司。 可悲的是,我的应用程序现在崩溃了。 该字体用于我正在使用的第三方库。 Twitter上的许多人正在报告问题。

如果您是dynamic访问斜体字体,而不是按名称访问字体[UIFont fontWithName:@"HelveticaNeue-Italic" size:15.0f] use [UIFont italicSystemFontOfSize:15.0f]这对我来说工作得很好。

我目前没有find会话,但他们说了一些你不能依赖iOS7上的字体的东西。 他们甚至可以在应用程序的生命周期中进行更改。 这基本上意味着:当你在你的应用程序中指定字体的时候,你会搞砸了,使用字体描述符或首选字体!

我发现了另一个似乎工作的解决scheme。 我登出了一个电话

[[UIFont italicSystemFontOfSize:12.0] fontName]

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

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

作品! 通过可视化比较,上述调用返回的字体与原始“HelveticaNeue-Italic”字体完全相同。

这个问题几乎可以肯定是一个错误… Helvetica Neue是iOS 7中的默认字体,因此该系列中的字体不应该丢失。 在Xcode v5.0中一切正常,但升级到5.0.1后立即出现此问题。 我已经提交了一个苹果公司的错误logging。 在此之前,这个解决scheme似乎工作…

我向苹果提交的错误报告已被标记为“封闭为重复”。 我希望这意味着他们认为这是一个错误。 但是,iOS 7.0.4并不能解决这个问题。

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

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

从7.0.6开始,UIWebView中仍然缺less常规的斜体,并且在同一个系列中似乎又回到了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。

我有一个相同的崩溃,只能在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