为整个iOS应用程序使用自定义字体

我知道要在屏幕上设置一个元素的自定义字体,我可以简单地做一些someLabel.font=UIFont(name: "Exo 2.0", size: 15)

我想知道如何使用swift为整个应用程序设置它。 (黑客应该做我所知道的应用程序的每一个元素,但这只是一个可维护性的噩梦)

我发现这个问题已经被问到一个客观的C标签, 如何设置一个自定义的字体为整个iOS应用程序没有指定的大小,但我不够熟悉Objective-C足以将代码移植到迅速

你可以设置UILabel和其他UIViews的外观:

 UILabel.appearance().font = UIFont(name: "yourFont", size: yourSize) 

更一般的:

 AnyUIView.appearance().font = UIFont(name: "yourFont", size: yourSize) 

作为一个更详细的答案和这些好处,我build议使用扩展:

  • 没有尺寸覆盖(无论你在devise师设置将被使用)
  • 没有样式覆盖(粗体,浅色,中等,UltraLight在我的代码中实现,但您可以根据需要自定义)
 import UIKit extension UILabel { public var substituteFontName : String { get { return self.font.fontName; } set { let fontNameToTest = self.font.fontName.lowercased(); var fontName = newValue; if fontNameToTest.range(of: "bold") != nil { fontName += "-Bold"; } else if fontNameToTest.range(of: "medium") != nil { fontName += "-Medium"; } else if fontNameToTest.range(of: "light") != nil { fontName += "-Light"; } else if fontNameToTest.range(of: "ultralight") != nil { fontName += "-UltraLight"; } self.font = UIFont(name: fontName, size: self.font.pointSize) } } } extension UITextView { public var substituteFontName : String { get { return self.font?.fontName ?? ""; } set { let fontNameToTest = self.font?.fontName.lowercased() ?? ""; var fontName = newValue; if fontNameToTest.range(of: "bold") != nil { fontName += "-Bold"; } else if fontNameToTest.range(of: "medium") != nil { fontName += "-Medium"; } else if fontNameToTest.range(of: "light") != nil { fontName += "-Light"; } else if fontNameToTest.range(of: "ultralight") != nil { fontName += "-UltraLight"; } self.font = UIFont(name: fontName, size: self.font?.pointSize ?? 17) } } } extension UITextField { public var substituteFontName : String { get { return self.font?.fontName ?? ""; } set { let fontNameToTest = self.font?.fontName.lowercased() ?? ""; var fontName = newValue; if fontNameToTest.range(of: "bold") != nil { fontName += "-Bold"; } else if fontNameToTest.range(of: "medium") != nil { fontName += "-Medium"; } else if fontNameToTest.range(of: "light") != nil { fontName += "-Light"; } else if fontNameToTest.range(of: "ultralight") != nil { fontName += "-UltraLight"; } self.font = UIFont(name: fontName, size: self.font?.pointSize ?? 17) } } } 

使用扩展的样本:

例如把这些行放在你的起始控制器viewDidLoad中

  UILabel.appearance().substituteFontName = "IRANSans"; // USE YOUR FONT NAME INSTEAD UITextView.appearance().substituteFontName = "IRANSans"; // USE YOUR FONT NAME INSTEAD UITextField.appearance().substituteFontName = "IRANSans"; // USE YOUR FONT NAME INSTEAD 

PS作为@Christian提到,你可以写几乎AnyUIView自己的扩展

我发现了一种在iOS 4中使用Swift 4的方法

只需要在variables名称之前添加@objc关键字。 所以variables声明就是这样的

 @objc public var substituteFontName : String { get {} set {} } 

希望这可以帮助那些面临这个问题的人。