UIFontMetrics 不适用于带有 Xcode 15 的 iOS 17 中的自定义字体

问题描述 投票:0回答:1

我正在创建新的应用程序,并且我必须使用自定义字体。我还计划支持动态字体类型。这就是为什么我要创建通用结构,它将在不同的应用程序位置为我提供字体。 为此,我编写了以下代码。

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 的字体大小。我在这里做错了什么?

ios swift uikit custom-font
1个回答
0
投票

您的函数返回不同的结果 - 碰巧您手机的动态字体大小是默认(标准)大小,因此所有内容都按 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)
}
© www.soinside.com 2019 - 2024. All rights reserved.