FontSystemKit

动机

在 iOS 中,使用 UIAppearance 系统设置 UILabel 的字体一直有点麻烦。如果您设置了全局外观,它会影响所有标签的字体大小(和字重)以及字体类型。您可以使用(本来不必要的)外观容器父视图或视图子类来解决这个问题,但它们会增加代码的大小和复杂性。

您还必须手动为每个文本样式设置字体大小和字重,然后确保使用 UIFontMetrics,以便在使用动态类型时字体可以缩放。

使用 FontSystemKit,您可以解决这个问题,通常只需一行代码即可。

您可以使用您选择的字体创建一个 FontSystem 对象,它可以根据相应系统字体的大小和字重自动为每种文本样式创建可缩放字体。然后,您可以使用外观代理在应用程序中全局设置(几乎)所有 UILabel 对象。

这个包应该被认为是实验性的。如果您发现任何可以改进的地方,欢迎提交您的 pull request!

创建和使用 FontSystem 对象

使用这个包的先决条件是您的应用程序的标签正在使用系统文本样式(例如,“body”或“headline”)。

基本用法

创建字体系统对象的典型方法是传入基本字体名称(例如,“AmericanTypewriter”)和您想要使用的任何字重的后缀(例如,“-Bold”)。

然后使用 UILabel 的外观代理在应用程序中的所有 UILabel 上设置字体系统。

import FontSystemKit
import UIKit

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // ...

    // Set (nearly) all labels to use the appropriate size/weight of American Typewriter
    UILabel.appearance().fontSystem = FontSystem(baseName: "AmericanTypewriter", boldSuffix: "-Bold")
    
    // ...
    
    return true
}

为每种样式选择您自己的字体

如果您使用无参数构造函数,则字体系统将使用每种文本样式的首选系统字体初始化。然后,您可以单独设置仅那些您想要覆盖的文本样式的字体

let fontSystem = FontSystem()
fontSystem.setFont(UIFont(name: "Avenir-Black", size: 20.0)!, forTextStyle: .headline)

UILabel.appearance().fontSystem = fontSystem

覆盖特定样式的系统字重

您还可以选择用于文本样式的特定字重

let fontSystem = FontSystem(baseName: "Avenir",
                            regularSuffix: "-Book",
                            lightSuffix: "-Light",
                            mediumSuffix: "-Medium", 
                            heavySuffix: "-Heavy", 
                            blackSuffix: "-Black")!
                            
fontSystem.useWeight(.black, forTextStyle: .headline)

UILabel.appearance().fontSystem = fontSystem