【问题标题】:Download font .ttf file from web and store on iPhone从网络下载字体 .ttf 文件并存储在 iPhone 上
【发布时间】:2013-05-16 01:29:36
【问题描述】:

是否可以从网上下载 .ttf 文件并将其存储在 iPhone 上。然后将其用于标签和所有其他东西?因为我的客户想要控制数据库中的字体并且不想立即将字体放到 xcode 项目中。

所以以后如果他想改变字体,他会将新字体添加到数据库中,应用程序会在网络上识别新字体(这已经完成了图像,没问题),下载并用作字体。

谢谢。

【问题讨论】:

    标签: objective-c database download nsfilemanager uifont


    【解决方案1】:

    字体必须在应用程序的 plist 中设置,并且该文件在运行时无法更改,因此您需要使用已添加到其中的字体来编译项目。

    你必须以其他方式来实现它。

    【讨论】:

    • 我也是这么想的...好吧,我会告诉他将所有需要的字体添加到 xcode 项目中,然后调整要从数据库中使用的字体...所以我无法打开字体来自另一个自己创建的 plist ?
    • 它必须在应用程序的主 plist 中,并且是在编译时创建的,所以你不能做任何事情,抱歉。如果有用,请采纳答案。
    【解决方案2】:

    您可以使用 FontLabel (https://github.com/vtns/FontLabel) 或其他。类似于从文件系统加载 ttfs。我认为您不能将下载的字体与 UILabel 一起使用。因为您需要每种字体的 plist 条目。

    【讨论】:

    • 我会从数据库中下载 ttf,然后在下载并添加到 plist(系统或新的,自行创建)时将它们用于标签或任何其他文本。可能吗?
    • FontLabel 是 UILabel 的替代品。在 iOS 4 之前,它是使用自定义字体的唯一选择。使用 FontLabel,您不需要 plist 条目 - 因此您的下载方法应该可以工作。
    【解决方案3】:

    实际上可以像这样动态地将字体添加到 iOS 运行时:

    NSData *fontData = /* your font-file data */;
    CFErrorRef error;
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)inData);
    CGFontRef font = CGFontCreateWithDataProvider(provider);
    if (! CTFontManagerRegisterGraphicsFont(font, &error)) {
        CFStringRef errorDescription = CFErrorCopyDescription(error)
        NSLog(@"Failed to load font: %@", errorDescription);
        CFRelease(errorDescription);
    }
    CFRelease(font);
    CFRelease(provider);
    

    来源:Marco Arment 的This Blog Article

    【讨论】:

      【解决方案4】:

      这是可能的。我在 github 中创建了一个示例 swift 项目。您只需在下面添加几行即可。

      var uiFont : UIFont?
      let fontData = data
      
      let dataProvider = CGDataProviderCreateWithCFData(fontData)
      let cgFont = CGFontCreateWithDataProvider(dataProvider)
      
      var error: Unmanaged<CFError>?
      if !CTFontManagerRegisterGraphicsFont(cgFont, &error)
      {
         print("Error loading Font!")
      } else {
         let fontName = CGFontCopyPostScriptName(cgFont)
         uiFont = UIFont(name: String(fontName) , size: 30)
      }
      

      Github project link

      【讨论】:

        【解决方案5】:

        Swift 4 扩展解决方案:

        extension UIFont {
        
            /**
             A convenient function to create a custom font with downloaded data.
        
             - Parameter data: The local data from the font file.
             - Parameter size: Desired size of the custom font.
        
             - Returns: A custom font from the data. `nil` if failure.
        
             */
            class func font(withData data: Data, size: CGFloat) -> UIFont? {
        
                // Convert Data to NSData for convenient conversion.
                let nsData = NSData(data: data)
        
                // Convert to CFData and prepare data provider.
                guard let cfData = CFDataCreate(kCFAllocatorDefault, nsData.bytes.assumingMemoryBound(to: UInt8.self), nsData.length),
                    let dataProvider = CGDataProvider(data: cfData),
                    let cgFont = CGFont(dataProvider) else {
                    print("Failed to convert data to CGFont.")
                    return nil
                }
        
                // Register the font and create UIFont.
                var error: Unmanaged<CFError>?
                CTFontManagerRegisterGraphicsFont(cgFont, &error)
                if let fontName = cgFont.postScriptName,
                    let customFont = UIFont(name: String(fontName), size: size) {
                    return customFont
                } else {
                    print("Error loading Font with error: \(String(describing: error))")
                    return nil
                }
        
            }
        }
        

        用法:

        let customFont = UIFont.font(withData: data, size: 15.0)
        

        【讨论】:

          猜你喜欢
          • 2014-12-08
          • 2015-04-29
          • 2013-05-11
          • 2017-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-02
          • 1970-01-01
          相关资源
          最近更新 更多