我正在创建新的应用程序,并且我必须使用自定义字体。我还计划支持动态字体类型。这就是为什么我要创建通用结构,它将在不同的应用程序位置为我提供字体。 为此,我编写了以下代码。
static func getHeaderFont(forStyle style: UIFont.TextStyle) -> UIFont {
guard let font = UIFont(name: "Montserrat-SemiBold", size: UIFont.systemFontSize) else { fatalError("No font found") }
return UIFontMetrics(forTextStyle: style).scaledFont(for: font)
}
为此,我正在遵循此指南 但无论我传递给这个函数的样式是什么,我总是得到相同的字体大小和样式。 这是我的测试截图。 我试图获取 title2、headline、body、caption2 的字体大小。我在这里做错了什么?
您的函数将返回不同的结果 - 碰巧您手机的动态字体大小是默认(标准)大小,因此所有内容都按 1 倍缩放(也称为根本没有变化)。
如果您在设置应用程序中更改动态字体大小,您会看到例如
.caption1
和 .extraLargeTitle
的缩放比例不同。如果你把它改大一点,.extraLargeTitle
不会改变太多,但是.caption1
会大很多,因为字幕通常比“特大标题”小:D
我认为你误解了
UIFontMetrics
的目的是什么。它不是为了确定文本样式的合适字体大小(您应该自己确定),而是为了根据动态字体大小设置和文本样式确定现有字体的scale多少。
当动态字体大小为默认设置时,不需要缩放,并且您将始终获得与传入的字体大小相同的字体大小(在本例中为
UIFont.systemFontSize
)。
当动态字体大小设置更改时,不同的
TextStyle
会以不同的方式缩放 - 这就是 forTextStyle
参数的用途。
如果您希望字体的字体大小始终与给定
TextStyle
的系统字体匹配(不推荐),请参阅规范此处。获取“大(默认)”列中的尺寸,并在代码中使用它代替 UIFont.systemFontSize
。
如果您使用自定义字体,很自然地还要为每种文本样式设计自己的字体大小,而不是依赖为系统字体设计的字体大小。虽然系统字体的字体在系统字体上看起来不错,但它可能不适合您的自定义字体。
func customFont(forStyle style: UIFont.TextStyle) -> UIFont {
let fontSize: CGFloat
switch style {
// here, decide what size you want to use for each text style.
// you can use the sizes for the system font as I linked above
// if you really want to
case .body:
fontSize = ...
case .caption1:
fontSize = ...
// etc
}
guard let font = UIFont(name: "Montserrat-SemiBold", size: fontSize) else { fatalError("No font found") }
return UIFontMetrics(forTextStyle: style).scaledFont(for: font)
}