【问题标题】:CGFontCreateWithDataProvider hangs in airplane modeCGFontCreateWithDataProvider 在飞行模式下挂起
【发布时间】:2014-09-14 01:50:01
【问题描述】:

当我拨打CGFontCreateWithDataProvider在飞行模式时,我的应用程序冻结。不在飞行模式下,它工作正常。字体存储在设备上,不应发生网络访问。

调用该方法加载本地字体文件时:

[self registerIconFontWithURL:[[NSBundle mainBundle] URLForResource:@"FontAwesome" withExtension:@"otf"]];

以下方法中url的值为: file:///var/mobile/Applications/48D3DA14-235B-4450-A081-7A6BA6116667/Blah.app/FontAwesome.otf

+ (void)registerIconFontWithURL:(NSURL *)url
{
    NSAssert([[NSFileManager defaultManager] fileExistsAtPath:[url path]], @"Font file doesn't exist");
    CGDataProviderRef fontDataProvider = CGDataProviderCreateWithURL((__bridge CFURLRef)url);

//******Freezes after the next line******
    CGFontRef newFont = CGFontCreateWithDataProvider(fontDataProvider);
//******FROZEN******

    CGDataProviderRelease(fontDataProvider);
    CFErrorRef error;
    CTFontManagerRegisterGraphicsFont(newFont, &error);
    CGFontRelease(newFont);
}

iOS 7.1.x,iPhone 5。

我不知道为什么会发生这种情况,也无法找到任何帮助。有谁知道为什么会发生这种情况?

提前致谢!

【问题讨论】:

  • 贴出相关代码
  • url 的值是多少?
  • @rmaddy 你看得太早了,它现在就在那里 =)
  • 为什么不使用CTFontManagerRegisterFontsForURL()

标签: ios objective-c fonts freeze


【解决方案1】:

经过一番搜索,我找到了答案。

根据以下错误报告:https://alpha.app.net/jaredsinclair/post/18555292

如果没有网络连接,CGFontCreateWithDataProvider() 会挂起 在信号量陷阱中 if 它在 appDidFinishLaunchingWithOptions。在下一个运行循环中调用它 无需悬挂即可工作。

如同一篇文章中所述,调用

[UIFont familyNames]

CGFontCreateWithDataProvider()之前

解决了这个问题。我的代码现在看起来像这样并且按预期工作:

+ (void)registerIconFontWithURL:(NSURL *)url
{
    NSAssert([[NSFileManager defaultManager] fileExistsAtPath:[url path]], @"Font file doesn't exist");
    CGDataProviderRef fontDataProvider = CGDataProviderCreateWithURL((__bridge CFURLRef)url);

    //THE NEXT LINE IS RELEVANT PART
    [UIFont familyNames];

    CGFontRef newFont = CGFontCreateWithDataProvider(fontDataProvider);
    CGDataProviderRelease(fontDataProvider);
    CFErrorRef error;
    CTFontManagerRegisterGraphicsFont(newFont, &error);
    CGFontRelease(newFont);
}

【讨论】:

  • 调用[UIFont familyNames]; 解决了我的问题!哇!你是怎么想出来的:o
  • @Hlung 我搜索了一下,发现我的答案中提到的错误报告......救了我=)
  • 哇,不错。你是怎么发现这个的?
  • @ManuelM。一些幸运/疯狂的谷歌搜索 =)
  • 这也解决了我的问题,尽管我没有在飞行模式下调用它(即我有一个有效的网络连接)。我试图从 UIFont 的扩展中调用它,在类的 initialize() 方法的覆盖内(这是在 Swift 中)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多