从网上下载字体.ttf文件并存储到iPhone

3

是否可以从网上下载.ttf文件并将其存储在iPhone上,然后用于标签和其他所有内容?因为我的客户希望从数据库控制字体,而不是立即将字体放入Xcode项目中。

因此,如果他将来想要更改字体,他将向数据库添加新字体,应用程序将在Web上识别新字体(这已经完成了图像,不是问题),下载它并用作字体。

谢谢。

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。


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项目链接:https://github.com/gyurui/CustomFonts-Swift 图片描述:在此处输入图片描述

1
字体必须在您的应用程序的plist中设置,该文件在运行时无法更改,因此您需要在编译项目时将字体添加到其中。
您必须考虑其他实现方式。

这正是我所想的...好吧,我会告诉他将所有需要的字体添加到Xcode项目中,然后只需从数据库中调整要使用哪个字体...那么我不能从另一个自己创建的plist中打开字体吗? - zhuber
它必须在应用程序的主要plist中,并且是在编译时创建的,所以很抱歉您无法做任何事情。如果这个答案有用,请接受它。 - Antonio MG

0
你可以使用FontLabel(https://github.com/vtns/FontLabel)或类似的工具从文件系统中加载ttf字体。我认为你不能在UILabel中使用下载的字体,因为你需要每个字体的plist条目。

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

-1

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)

这与之前的答案相同 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接