Xcode: Using custom fonts inside Dynamic framework

匿名 (未验证) 提交于 2019-12-03 01:23:02

问题:

I added custom font to a framework. I followed all the steps, but it doesn't work.

I am able to set the font in Interface Builder, but when I build the project it doesn't show this font on the simulator/device.

回答1:

I'm here a bit late, but I took PetahChristian's solution and created a Swift version in the form of an extension. This is working for me. I've found that when you try to get a font using a font name and a size using the regular way that it always looks in the main bundle for the font file, and there's no method that takes a bundle identifier as a parameter. It would be nice if Apple would make one.

Swift:

public extension UIFont {  public static func registerFontWithFilenameString(filenameString: String, bundle: Bundle) {      guard let pathForResourceString = bundle.path(forResource: filenameString, ofType: nil) else {         print("UIFont+:  Failed to register font - path for resource not found.")         return     }      guard let fontData = NSData(contentsOfFile: pathForResourceString) else {         print("UIFont+:  Failed to register font - font data could not be loaded.")         return     }      guard let dataProvider = CGDataProvider(data: fontData) else {         print("UIFont+:  Failed to register font - data provider could not be loaded.")         return     }      guard let fontRef = CGFont(dataProvider) else {         print("UIFont+:  Failed to register font - font could not be loaded.")         return     }      var errorRef: Unmanaged? = nil     if (CTFontManagerRegisterGraphicsFont(fontRef, &errorRef) == false) {         print("UIFont+:  Failed to register font - register graphics font failed - this font may have already been registered in the main bundle.")     } }


回答2:

Here's my version of John's answer, showing how to call the function if you have lots of fonts

import Foundation  extension UIFont {      @nonobjc static var loadAllFontsDO: dispatch_once_t = 0      class func initialsAvatarFont() -> UIFont {         loadAllFonts()         if let retval = UIFont(name: "MyFontName", size: kInitialsAvatarFontSize) {             return retval;         } else {             return UIFont.systemFontOfSize(kInitialsAvatarFontSize)         }     }      class func loadAllFonts() {         dispatch_once(&loadAllFontsDO) { () -> Void in             registerFontWithFilenameString("thefontfilename.ttf", bundleIdentifierString: "nameOfResourceBundleAlongsideTheFrameworkBundle")             // Add more font files here as required         }     }      static func registerFontWithFilenameString(filenameString: String, bundleIdentifierString: String) {         let frameworkBundle = NSBundle(forClass: AnyClassInYourFramework.self)         let resourceBundleURL = frameworkBundle.URLForResource(bundleIdentifierString, withExtension: "bundle")         if let bundle = NSBundle(URL: resourceBundleURL!) {             let pathForResourceString = bundle.pathForResource(filenameString, ofType: nil)             let fontData = NSData(contentsOfFile: pathForResourceString!)             let dataProvider = CGDataProviderCreateWithCFData(fontData)             let fontRef = CGFontCreateWithDataProvider(dataProvider)             var errorRef: Unmanaged? = nil              if (CTFontManagerRegisterGraphicsFont(fontRef!, &errorR  
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!