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

Sco*_*ski 100 objective-c uifont ios7

刚刚将我的iPod touch升级到iOS 7.0.3并且"HelveticaNeue-Italic"似乎已经消失了.当我在手机上查询时:

[UIFont fontNamesForFamilyName:@"Helvetica Neue"]
Run Code Online (Sandbox Code Playgroud)

我得到以下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
Run Code Online (Sandbox Code Playgroud)

当我在模拟器中运行相同的查询时,我得到(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
Run Code Online (Sandbox Code Playgroud)

其他人都看到了吗?

- - 新的消息 - -

我回到WWDC 2013视频"使用带有文本工具包的字体",有趣的部分从12:22开始.演示者以OS X中的"MetaFonts"为例进行讨论.他说的是调用的字体如:

+ (NSFont *)messageFontOfSize:(CGFloat)fontSize
Run Code Online (Sandbox Code Playgroud)

不保证在版本甚至不同用途中返回相同的底层字体.他的榜样是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];
Run Code Online (Sandbox Code Playgroud)

我确实为fontWithDescriptor获得了一个有效的UIFont,当我查询fontName的字体时:

[fontWithDescriptor fontName]
Run Code Online (Sandbox Code Playgroud)

我回来了...

HelveticaNeue-Italic
Run Code Online (Sandbox Code Playgroud)

去搞清楚???

所以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];
Run Code Online (Sandbox Code Playgroud)

这似乎做了所有正确的事情.我尝试使用另一种字体系列的前一种方法,它似乎与fontName和fontFamily混淆.希望这可以帮助!

Mik*_*ler 31

这是一个Apple bug.它是在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);
}
Run Code Online (Sandbox Code Playgroud)

还值得注意的是,在当前版本的Xcode(5.0.1(5A2053))中,此字体未在Interface Builder的"字体"下拉列表中列为选项.因此,如果您之前使用此字体配置了标签,您会注意到ui被混淆,并且标签最终在运行时被分配了一些其他字体和大小(请参阅下面的ui screencap).对于在storyboards/xib中配置的标签,您需要在代码中重置字体.

这里参考的是开发论坛中对该问题的讨论.

在此输入图像描述


Dav*_*ong 7

这是iOS 7.0.3中的一个错误.

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

UIFont* font = (__bridge_transfer UIFont*)CTFontCreateWithName(CFSTR("HelveticaNeue-Italic"), fontSize, NULL);
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*chs 2

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

  • 我能找到的最接近的匹配是http://asciiwwdc.com/2013/sessions/223,但看起来它们指的是可下载字体,而不是系统提供的字体。 (2认同)