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中配置的标签,您需要在代码中重置字体.
这里参考的是开发论坛中对该问题的讨论.

这是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(因为CTFontRef和UIFont不免费电话桥接在iOS 6).但是,在iOS 6上,您只需使用常规字体查找代码即可.
我目前没有找到该会议,但他们说你不能再依赖 iOS7 上可用的字体了。它们甚至可以在应用程序的生命周期内发生变化。这基本上意味着:当您在应用程序中指定字体时,您就完蛋了,请使用字体描述符或首选字体!
| 归档时间: |
|
| 查看次数: |
27209 次 |
| 最近记录: |