2014-12-06 56 views
2

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

我跟了一些其他的导游试图从一个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)") 
     } 
+0

你在哪里声明了var fontFile? – 2014-12-06 06:53:13

回答

0

我不是当然,如果这会帮助你,但它可能会。该网站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; 
    }); 
}