在 SwiftUI 中,dynamicTypeSize(_:) 是一个视图修饰符,用于限制视图支持的 Dynamic Type Sizes(动态类型大小) 范围。通过这个修饰符,可以指定某个视图仅支持某些字体大小,从而为不同的动态字体设置提供更好的适配。
基本语法
.dynamicTypeSize(_ range: ClosedRange<DynamicTypeSize>)
range 是一个范围,指定视图支持的动态类型大小范围。类型为 ClosedRange<DynamicTypeSize>。
可以使用标准大小(例如 .medium … .xxxLarge)或包含辅助功能大小的范围。
使用示例
限制动态类型大小范围
以下代码限制视图只支持从默认大小(.medium)到超大字体(.xxxLarge):
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Hello, Dynamic Type!")
.dynamicTypeSize(.medium ... .xxxLarge)
}
}
如果用户的系统字体设置超出 .xxxLarge(例如辅助功能尺寸 .accessibility1),文本大小将被限制在 .xxxLarge。
也可以使用半开区间限制动态字体大小范围:
Text("Hello, Dynamic Type!")
.dynamicTypeSize(...DynamicTypeSize.xxxLarge)
等效代码
以下写法是等效的,明确指定了范围:
Text("Hello, Dynamic Type!")
.dynamicTypeSize(.xSmall ... .xxxLarge)
通过 …DynamicTypeSize.xxxLarge,开发者可以确保视图不会因为动态字体的设置而显示异常,为用户提供更好的布局控制。
完全不支持动态类型
可以将范围限制为单一值,从而禁止动态字体变化:
Text("Fixed Size Text")
.dynamicTypeSize(.medium)
此代码使文本大小固定为 .medium,无论用户的字体设置如何。
支持辅助功能尺寸
如果需要支持辅助功能的大字体(例如 .accessibility1 … .accessibility5),可以指定范围:
Text("Accessible Text")
.dynamicTypeSize(.medium ... .accessibility5)
不同视图的范围组合
VStack {
Text("Supports Standard Sizes")
.dynamicTypeSize(.xSmall ... .xxxLarge)
Text("Supports Accessibility Sizes")
.dynamicTypeSize(.accessibility1 ... .accessibility5)
}
第一个 Text 视图支持标准尺寸,第二个 Text 视图支持辅助功能尺寸。
结合 @Environment(\.dynamicTypeSize)
可以动态检查用户的字体大小设置,并基于此调整修饰符:
import SwiftUI
struct ContentView: View {
@Environment(\.dynamicTypeSize) var dynamicTypeSize
var body: some View {
Text("Dynamic Type Example")
.dynamicTypeSize(dynamicTypeSize.isAccessibilitySize
? .accessibility1 ... .accessibility5
: .medium ... .xxxLarge)
}
}
注意事项
1、内容裁剪问题
如果动态字体过大,而视图未适配,可能会导致内容裁剪。通过限制范围可以避免这一问题。
2、优先级
如果视图树中父视图使用了 .dynamicTypeSize(_),子视图会继承该范围设置,除非子视图明确覆盖此设置。
3、辅助功能优先支持
当用户启用辅助功能字体时,限制范围需要覆盖更大的字体大小(如 .accessibility1 … .accessibility5)。
通过 dynamicTypeSize(_:),开发者可以更灵活地控制视图在不同动态字体下的表现,为用户提供更好的体验。
相关文章
SwiftUI环境变量Dynamic Type Size动态类型大小:https://fangjunyu.com/2024/12/24/swiftui%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8fdynamic-type-size%e5%8a%a8%e6%80%81%e7%b1%bb%e5%9e%8b%e5%a4%a7%e5%b0%8f/