Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I embed a custom font in a bundle and access it from an ios framework?

I'm creating an ios framework with its bundle for packaging ressources (nib, images, fonts) and I'm trying to embed a custom font in the bundle but I'm not able to load it from the framework, is it possible ?

1) I can localize the font file with this: objc NSString *fontPath = [[NSBundle frameworkBundle] pathForResource:@"MyCustomFont" ofType:@"ttf"]; 2) But I can't get it in my fonts lists: objc NSArray * array = [UIFont familyNames]; I included my font name in the bundle's plist with a "Fonts provided by application", without success, tried also in the app info plist, include it in the framework ressource without success.

I can load the nib and images from the bundle (by prefixing with the bundle's name) but not for the font. Any thought ?

EDIT : I saw the following post : Can I embed a custom font in an iPhone application?, but the question is just "Can I embed a custom font in an iPhone application?" not "Can I embed a custom font in an external framework/bundle ?" It also makes references to a dynamic loading which is interesting but it is using private api, which is not usable solution for a framework.

Thanks

like image 254
Nicolas Lauquin Avatar asked Feb 06 '13 17:02

Nicolas Lauquin


People also ask

How do you embed custom fonts?

Open the file you want to embed fonts in. On the application (PowerPoint or Word) menu, select Preferences. In the dialog box, under Output and Sharing, select Save. Under Font Embedding, select Embed fonts in the file.

How do I import fonts to iOS?

You can download fonts from the App Store app , then use them in documents you create on iPhone. After you download an app containing fonts from the App Store, open the app to install the fonts. To manage installed fonts, go to Settings > General, then tap Fonts.


1 Answers

Swift 3:

Firstly, don't access framework bundle from main with appending path components... Instantiate it from its identifier. You can get font URLs like this:

static func fontsURLs() -> [URL] {     let bundle = Bundle(identifier: "com.company.project.framework")!     let fileNames = ["Roboto-Bold", "Roboto-Italic", "Roboto-Regular"]     return fileNames.map({ bundle.url(forResource: $0, withExtension: "ttf")! }) } 

And I find it nice to have UIFont extension for registering fonts:

public extension UIFont {     public static func register(from url: URL) throws {         guard let fontDataProvider = CGDataProvider(url: url as CFURL) else {             throw SVError.internal("Could not create font data provider for \(url).")         }         let font = CGFont(fontDataProvider)         var error: Unmanaged<CFError>?         guard CTFontManagerRegisterGraphicsFont(font, &error) else {             throw error!.takeUnretainedValue()         }     } } 

Now enjoy the registration:

do {     try fontsURLs().forEach({ try UIFont.register(from: $0) }) } catch {     print(error) } 
like image 129
Stanislav Smida Avatar answered Sep 21 '22 10:09

Stanislav Smida