Swash 4.0.0

Swash 4.0.0

Sam Francis 维护。



Swash 4.0.0

Swash

Version Swift 5.1 Platforms Carthage compatible License

Swash 是对 UIFont 的简单、安全和简洁的抽象,内置对动态类型的支持。

使用方法

要定义一个自定义字体,只需创建一个符合 Font 协议的 String 枚举。

enum Papyrus: String, Font {
    case regular = "Papyrus"
    case condensed = "Papyrus-Condensed"
}

这就是您在项目中开始使用字体的全部所需!

静态尺寸

label.font = Papyrus.regular.of(size: 17)

动态类型(iOS 11+)

使用 UIFontMetrics 进行缩放。将 adjustsFontForContentSizeCategory 设置为 true,告诉标签在用户更改其内容大小首选项时自动更新字体。请参阅我们的 博客文章,了解有关为文本样式选择默认大小的指导,或者只需使用 Swash 提供的默认值,这些默认值是从 Apple 的人类界面指南中提取的,用于 iOSwatchOStvOS

label1.adjustsFontForContentSizeCategory = true
label2.adjustsFontForContentSizeCategory = true

label1.font = Papyrus.condensed.of(textStyle: .headline)
// Optional size cutoff and default size.
label2.font = GillSans.bold.of(textStyle: .title1, defaultSize: 28, maxSize: 38)

Dynamic Type Demo

动态类型(iOS 11之前的版本)

使用系统字体缩放,没有默认大小值。adjustsFontForContentSizeCategory 需要使用 UIFontMetrics,因此 iOS 11之前的自定义字体无法使用它。您需要在 traitCollectionDidChange(_:) 中手动更新字体,或者在观察 UIContentSizeCategoryDidChange 通知。

label.font = Papyrus.condensed.of(style: .headline)
// Optional size cutoff
label.font = GillSans.bold.of(style: .title1, maxSize: 30)

系统字体

您可以使用 SystemFont 支持不同权重下的动态类型,并在项目中统一字体语法。

label1.font = SystemFont.light.of(size: 17)
label2.adjustsFontForContentSizeCategory = true
label2.font = SystemFont.preferred.of(textStyle: .body)
label3.font = SystemFont.semiboldItalic.of(textStyle: .body, maxSize: 30)

重要提示:adjustsFontForContentSizeCategory 只适用于 SystemFontpreferred 权重,并且 maxSize 值为 nil。在其他任何情况下,您都需要在 traitCollectionDidChange(_:) 中更新字体,或者通过观察 UIContentSizeCategoryDidChange 通知来更新字体。这是因为 preferred 权重直接返回 UIFont.preferredFont(forTextStyle:) 的结果。

加粗文本设备设置

您可以在任何 Font 上实现 boldTextMapping 属性,以支持 iOS 和 tvOS 上的 "加粗文本" 设备设置。

var boldTextMapping: MyFont {
    switch self {
    case .regular: return .bold
    case .bold: return .black
    case .black: return self
    }
}

现在,如果用户在设备设置中将 "加粗文本" 设置打开,则每个常规 MyFont 实例都会变成加粗。

如果您愿意,可以通过 NotificationCenter 观察到 UIAccessibility.boldTextStatusDidChangeNotification 的更新,并在此更新时设置您的字体。

字体层叠

您可以在任何 Font 上实现静态的 cascadeList 属性来支持字体层叠。如果在标签中使用您不支持的字符时,此列表将提供要使用的备选字体。

enum Papyrus: String, Font {
    case condensed = "Papyrus-Condensed"
    case regular = "Papyrus"
    
    var cascadeList: [CascadingFontProperties] {
        [.init(Damascus.regular)]
    }
}

Papyrus 不支持阿拉伯文字符。因此,我们这里提供了 Damascus 作为备选字体。如果没有提供备选字体,系统字体将用于不支持字符。

生成模板

Swash 可以尝试为您记录字体模板!

Swash.logBoilerplate(forFontsWithFamilyNamesContaining: "gill")

输出

enum GillSans: String, Font {
    case GillSans-Italic = "GillSans-Italic"
    case GillSans-SemiBold = "GillSans-SemiBold"
    case GillSans-UltraBold = "GillSans-UltraBold"
    case GillSans-Light = "GillSans-Light"
    case GillSans-Bold = "GillSans-Bold"
    case GillSans = "GillSans"
    case GillSans-SemiBoldItalic = "GillSans-SemiBoldItalic"
    case GillSans-BoldItalic = "GillSans-BoldItalic"
    case GillSans-LightItalic = "GillSans-LightItalic"
}

只需将输出复制粘贴到您的项目中。您可能仍然需要修改一下类名。

调试崩溃

如果自定义字体初始化失败,将调用 assertionFailure(_:file:line:)。这将导致使用默认的 -Onone 编译器优化设置的调试构建崩溃。这样可以帮助识别失败的字体初始化,否则这可能会很难捕捉。**携带更高优化级别的发布构建不会崩溃**,所以您不用担心在生产环境中因字体引起的崩溃。

安装

CocoaPods

pod 'Swash'

Carthage

github "Mindgrub/Swash"

更新时请指定你的平台(例如:`carthage update --platform iOS`)。否则,将添加所有3个框架(iOS,tvOS和watchOS)。

许可协议

Swash 按照MIT许可证提供。更多信息请查看LICENSE文件。