使用动态文本大小.largeTitle,但始终比SwiftUI中的正常大小大18

ttp71kqs  于 2023-02-15  发布在  Swift
关注(0)|答案(2)|浏览(122)

我想在系统字体中使用动态的文本大小。但是我们的设计希望默认的大标题比苹果默认的34pt大一点。
如何使SwiftUI样式.font(.largeTitle)相对更大,即在系统默认文本大小时为40pt,但在用户更改系统文本大小时仍按比例缩放?始终比正常的. largeTitle大18%。
我不想使用.custom(<name>, size: <Float>, relativeTo: <Font.TextStyle>)指定San弗朗西斯科字体名称,因为这会生成警告并错过获得最佳视觉变体的机会。
我可以使用UIFont函数来调整字体规格,但我不能将太小的SwiftUI字体转换为UIFont。

xam8gpfp

xam8gpfp1#

我将此扩展添加到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))

这将获得所需大小的正确视觉变量(例如大尺寸的显示版本,或小尺寸的可读性更强的变量),以及与用户选定的文本大小的相对缩放。选择最接近所需大小的文本样式作为尺寸的基础有助于获得最佳比例。
我觉得这是最好的办法。

ijxebb2r

ijxebb2r2#

参见this answer here by Ashley Mills
如果它被删除,我会重复它在这里:

extension Font {
    static let fortypt = Font.custom("", size: 40, relativeTo: .title)
}

要更改字体,请添加名称(例如,对于圆角系统字体,这在iOS 15上有效,我认为您可以在iOS 16.1+上只做.fontDesign(.rounded)):

extension Font {
    static let fortypt = Font.custom(".AppleSystemUIFontRounded-Regular", size: 40, relativeTo: .title)
}

然后,您可以像使用任何其他类型一样使用该类型:

Text("Dynamic 40pt text")
    .font(.fortypt)

相关问题