在整个应用中动态更改字体系列

时间:2018-10-16 03:54:14

标签: ios uikit swift4 multitargeting

我正在一个多目标项目中,该项目包含两个应用程序,每个应用程序都有自己的品牌。

我已经区分了应用程序的名称,应用程序图标和应用程序的商标颜色,但是现在我需要从API提取商标详细信息后,动态地切换应用程序的字体系列。

我要解决的问题是保持相同的字体大小,但使用不同的字体系列。

我试图找到一种方法来使字体大小与其他字体系列相同,但没有成功,请告诉我,如果您有解决此特定情况的建议。

2 个答案:

答案 0 :(得分:0)

使用NUI在几分钟内更新整个应用程序的外观。您只需要在两个不同的文件中定义Theme1.nssTheme2.nss之类的主题,然后AppDelegate的application didFinishLaunchingWithOptions方法就可以告诉NUI框架将这些主题相应地加载到目标中

  

如果Target1

[NUISettings initWithStylesheet:@"Theme1"];    
     

#elif Target2

[NUISettings initWithStylesheet:@"Theme2"];
     

#endif

答案 1 :(得分:0)

我找到了一种方法来解决此问题。以下是解决此问题的步骤:

  • 第一步:创建UIFont的扩展名和以下代码,以覆盖字体名称和家族运行时。

代码示例:

  var appFontName = "ArialMT"
  var appFontBoldName = "Arial-BoldMT"

 extension UIFontDescriptor.AttributeName {
   static let nsctFontUIUsage = UIFontDescriptor.AttributeName(rawValue: "NSCTFontUIUsageAttribute")
 } 

extension UIFont {

@objc class func mySystemFont(ofSize size: CGFloat) -> UIFont {
    return UIFont(name: appFontName, size: size)!
}

@objc class func myBoldSystemFont(ofSize size: CGFloat) -> UIFont {
    return UIFont(name: appFontBoldName, size: size)!
}

@objc convenience init(myCoder aDecoder: NSCoder) {

    guard let fontDescriptor = aDecoder.decodeObject(forKey: "UIFontDescriptor") as? UIFontDescriptor else  {
        self.init(myCoder: aDecoder)
        return
    }
    let face = fontDescriptor.object(forKey: UIFontDescriptor.AttributeName.face) as? String ?? "Regular"
    var fontName = appFontName

    switch face {
    case "Regular":
        fontName = appFontName
    case "Bold":
        fontName = appFontBoldName
    default:
        fontName = appFontName
    }
    self.init(name: fontName, size: fontDescriptor.pointSize)!
}

class func overrideInitialize() {
    if self == UIFont.self {
        let systemFontMethod = class_getClassMethod(self, #selector(systemFont(ofSize:)))
        let mySystemFontMethod = class_getClassMethod(self, #selector(mySystemFont(ofSize:)))
        method_exchangeImplementations(systemFontMethod!, mySystemFontMethod!)

        let boldSystemFontMethod = class_getClassMethod(self, #selector(boldSystemFont(ofSize:)))
        let myBoldSystemFontMethod = class_getClassMethod(self, #selector(myBoldSystemFont(ofSize:)))
        method_exchangeImplementations(boldSystemFontMethod!, myBoldSystemFontMethod!)

        let initCoderMethod = class_getInstanceMethod(self, #selector(UIFontDescriptor.init(coder:)))
        let myInitCoderMethod = class_getInstanceMethod(self, #selector(UIFont.init(myCoder:)))
        method_exchangeImplementations(initCoderMethod!, myInitCoderMethod!)
    }
  }
}
  • 第2步:(用法)并调用overrideInitialize方法。

    UIFont.overrideInitialize()
    

它通过更改整个应用程序中的字体系列来保留字体大小。 :)