如何在 SwiftUI 中缩放系统字体以支持动态类型?

sin*_*o12 9 ios swiftui dynamic-type-feature

在 UIKit 中,我可以像这样更改 UILabel 的字体大小以支持使用系统字体的动态类型:

UIFontMetrics.default.scaledFont(for: UIFont.systemFont(ofSize: 16))
Run Code Online (Sandbox Code Playgroud)

我错了还是没有办法在 SwiftUI 中做这样的事情?如果我想使用系统字体但也支持动态类型,我可以只使用默认字体样式 .title 等吗?

这个来自 HackingWithSwift 的解决方案似乎只适用于自定义字体,对吗?

在此先感谢您的任何建议!

Asp*_*eri 6

以下方法有效(使用 Xcode 11.2.1 / iOS 13.2.2 测试)

var body: some View {
    Text("Hello, World!") // direct text .font
        .font(Font.system(size: UIFontMetrics.default.scaledValue(for: 16)))
}
Run Code Online (Sandbox Code Playgroud)

以及基于视图的修改器

VStack {
    Text("Hello, World!")
}
.font(Font.system(size: UIFontMetrics.default.scaledValue(for: 16)))
Run Code Online (Sandbox Code Playgroud)

  • 如果用户更改文本大小,显示的文本不会动态更新。 (8认同)
  • Welp,我也尝试过,但只信任使用的预览:“.environment(\.sizeCategory, .accessibilityExtraExtraExtraLarge)”我想这是一个错误?使用 .font(.title) 预览显示缩放后的尺寸。在运行时你的答案有效,谢谢! (2认同)

spn*_*nkr 5

只要你有

@Environment(\.sizeCategory) var sizeCategory
Run Code Online (Sandbox Code Playgroud)

.font(Font.system(size: UIFontMetrics.default.scaledValue(for: 16)))当系统字体大小发生变化时,加载的文件层次结构中的某个位置也会发生变化。

上面发布的视图修饰符 @Mokkun 可以工作,因为它包含环境变量sizeCategory

sizeCategory如果您将环境变量放在任何 SwiftUI 视图的顶部,然后直接使用,它也会起作用UIFontMetrics.default.scaledValue(...)。像这样:

import SwiftUI

struct ContentViewSheet: View {

    @Environment(\.sizeCategory) var sizeCategory
    
    var body: some View {
        Text("Hello world")
            .font(Font.system(size: UIFontMetrics.default.scaledValue(for: 16)))
    }
}


Run Code Online (Sandbox Code Playgroud)