【问题标题】:iOS - Download Dynamic FontsiOS - 下载动态字体
【发布时间】:2014-12-06 06:38:57
【问题描述】:

我正在尝试为我的应用动态下载字体,因为我经常想即时添加新字体,并且不想每次都重新提交我的应用。

我已按照其他一些指南尝试从 URL 下载字体文件,将其保存到应用程序的文档目录,然后使用 CGFontCreateWithDataProvider 和 CTFontManagerRegisterGraphicsFont 加载它。

但是,该应用程序始终无法通过“writeToFile”功能并吐出以下行:

println("Failed to save font: \(fontFile)")

我已验证“fontUrl”有效(从调试器复制并粘贴到我的桌面浏览器中)。

另外,'fontPath' 的值最终出现在调试器中,对我来说是正确的:

fontPath = "/Users/James/Library/Developer/CoreSimulator/Devices/E153E1F4-E3FD-4BCE-A40F-433EADF14591/data/Containers/Data/Application/969A248C-A7B3-4768-86E4-68A6C4E20ECF/Documents/Fonts/american_typewriter_medium_bt.ttf"

代码:

// Download and save font file
        let nsDocumentDirectory = NSSearchPathDirectory.DocumentDirectory
        let nsUserDomainMask = NSSearchPathDomainMask.UserDomainMask
        if let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true) {
            if paths.count > 0 {
                if let documentsDirectory = paths[0] as? String {
                    let fontPath = documentsDirectory.stringByAppendingPathComponent("Fonts/"+fontFile) as String
                    let fontUrl = NSURL(string: ApiUrlString + "fonts/" + fontFile)
                    if let fontData = NSData(contentsOfURL: fontUrl!)
                    {
                        if(!fontData.writeToFile(fontPath, atomically: true))
                        {
                            println("Failed to save font: \(fontFile)")
                            return
                        }
                    }
                    else
                    {
                        println("Failed to download font from URL: \(fontUrl)")
                        return
                    }

                    // Load Font
                    let data: NSData? = NSFileManager.defaultManager().contentsAtPath(fontPath)
                    if (data == nil)
                    {
                        println("Failed to load saved font: \(fontFile)")
                        return
                    }

                    var error: Unmanaged<CFError>?
                    let provider: CGDataProviderRef = CGDataProviderCreateWithCFData(data)
                    let font: CGFontRef = CGFontCreateWithDataProvider(provider)
                    if (!CTFontManagerRegisterGraphicsFont(font, &error))
                    {
                        println("Failed to register font, error: \(error)")
                        return
                    }

                    println("Successfully saved and registered font: \(fontFile)")
                }
            }
        }
        else
        {
            println("Failed to load documents directory: \(fontFile)")
        }

【问题讨论】:

  • 你在哪里声明了 var fontFile ?
  • 哪里可以解决这个问题。我目前正在搜索有关从安全 URL 下载 .ttf 文件的说明。

标签: ios swift fonts nsdata writetofile


【解决方案1】:

我不确定这是否会对您有所帮助,但可能会。网站iOS Font List 提到了可下载字体的使用。也许示例代码可以引导您走向正确的方向。

- (void)asynchronouslySetFontName:(NSString *)fontName toTextView:(UITextView *)textView {
    CGFloat size = 24.0f;
    UIFont *font = [UIFont fontWithName:fontName size:size];

    if (font && ([font.fontName compare:fontName] == NSOrderedSame || [font.familyName compare:fontName] == NSOrderedSame)) {
        textView.font = font;
        return;
    }

    NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithObject:fontName forKey:kCTFontNameAttribute];
    CTFontDescriptorRef desc = CTFontDescriptorCreateWithAttributes((__bridge CFDictionaryRef)attrs);

    NSMutableArray *descs = [NSMutableArray array];
    [descs addObject:(__bridge id)desc];
    CFRelease(desc);

    __weak UITextView *weakTextView = textView;

    CTFontDescriptorMatchFontDescriptorsWithProgressHandler((__bridge CFArrayRef)descs, NULL,  ^(CTFontDescriptorMatchingState state, CFDictionaryRef progressParameter) {
        if (state == kCTFontDescriptorMatchingDidFinish) {
            dispatch_async(dispatch_get_main_queue(), ^{
                weakTextView.font = [UIFont fontWithName:fontName size:size];
            });
        }

        return YES;
    });
}

【讨论】:

    猜你喜欢
    • 2012-12-12
    • 2020-12-10
    • 2016-07-22
    • 2017-06-10
    • 2012-05-05
    • 2012-08-08
    • 2016-11-05
    • 1970-01-01
    • 2018-02-06
    相关资源
    最近更新 更多