3

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

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

谢谢。

4

5 回答 5

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 的这篇博客文章

于 2013-05-28T12:35:02.603 回答
2

有可能的。我在 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 项目链接

在此处输入图像描述

于 2015-12-02T13:47:48.303 回答
1

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

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

于 2013-05-21T10:09:25.417 回答
0

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

于 2013-05-21T10:09:51.703 回答
0

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)
于 2018-11-24T03:20:14.207 回答