使用动态文本大小 .largeTitle 但总是比 SwiftUI 中的正常文本大 18%

Use dynamic text size .largeTitle but always 18% larger than normal in SwiftUI

我想在系统字体中使用动态文字大小。但是我们的设计希望默认的大标题比苹果默认的 34pt 大一点。

如何制作我的 SwiftUI 样式 .font(.largeTitle) 相对较大,即系统默认文本大小为 40pt,但当用户更改系统文本大小时仍按比例缩放?始终比普通 .largeTitle 大 18%。

我不想使用 San Francisco 字体名称 .custom(<name>, size: <Float>, relativeTo: <Font.TextStyle>) 因为这会生成警告并错过获得最佳光学变体的机会。

我可以使用 UIFont 函数来调整字体规格,但我无法将 too-small SwiftUI 字体转换为 UIFont。

你只需要添加一个.scaleEffect()修饰符,像这样:

Text("Hello, world!")
    .font(.largeTitle)
    .scaleEffect(1.18)

我将此扩展添加到 UIFont 以获取给定 TextStyle 的动态字体大小…

public extension UIFont {
    static func textStyleSize(_ style: UIFont.TextStyle) -> CGFloat {
        UIFont.preferredFont(forTextStyle: style).pointSize
    }
}

然后我的 SwiftUI ViewModifier 可以使用和缩放它。例如:

.font(.system(size: UIFont.textStyleSize(.largeTitle) * 1.176, weight: .bold))

这会获得正确的光学变体(例如大尺寸的显示版本,或小尺寸的更易读的变体)以获得我想要的确切尺寸,并根据用户选择的文本大小进行相对缩放。选择最接近所需尺寸的文字样式作为我尺寸的基础有助于获得最佳比例。

这对我来说似乎是最好的方法。