Swash
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 的人类界面指南中提取的,用于 iOS、watchOS 和 tvOS。
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)
动态类型(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
只适用于 SystemFont
的 preferred
权重,并且 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文件。