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
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.
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.
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) }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With