在 SwiftUI 中,使用 @Environment(\.dynamicTypeSize) 可以通过环境变量访问用户当前系统设置的 动态类型大小 (Dynamic Type Size)。
@Environment(\.dynamicTypeSize) var dynamicTypeSize
DynamicTypeSize 的用途
可以通过 dynamicTypeSize 实现基于用户的文本大小设置来调整视图行为,例如:
根据字体大小动态调整布局。
提供更好的辅助功能支持。
限制某些组件支持的字体范围。
示例
动态调整视图布局
import SwiftUI
struct ContentView: View {
@Environment(\.dynamicTypeSize) var dynamicTypeSize
var body: some View {
VStack {
Text("Hello, Dynamic Type!")
.font(.title)
if dynamicTypeSize.isAccessibilitySize {
Text("You're using an accessibility size!")
.foregroundColor(.green)
} else {
Text("You're using a standard size!")
.foregroundColor(.blue)
}
}
.padding()
}
}
dynamicTypeSize.isAccessibilitySize:
一个属性,用于检查用户是否选择了辅助功能级别的文本大小(例如 .accessibility1 或更大)。
调整布局响应文本大小
import SwiftUI
struct ContentView: View {
@Environment(\.dynamicTypeSize) var dynamicTypeSize
var body: some View {
VStack {
if dynamicTypeSize >= .accessibility3 {
Text("Large Text Layout")
.font(.headline)
} else {
Text("Compact Layout")
.font(.subheadline)
}
}
.padding()
}
}
比较动态文本大小:
通过 dynamicTypeSize >= .accessibility3,可以判断当前文本是否处于较大的辅助功能尺寸。
动态类型相关的属性和方法
DynamicTypeSize 枚举
它有以下值:
.xSmall, .small, .medium, .large, .xLarge, .xxLarge, .xxxLarge,
.accessibility1, .accessibility2, .accessibility3, .accessibility4, .accessibility5
这些值按照从最小到最大的字体大小顺序排列。分为两类:
1、标准尺寸(Standard Sizes)
2、辅助功能尺寸(Accessibility Sizes)
标准尺寸
.xSmall: 极小文本尺寸。
.small: 小文本尺寸。
.medium: 默认文本尺寸(系统默认值)。
.large: 稍大文本尺寸。
.xLarge: 更大文本尺寸。
.xxLarge: 非常大的文本尺寸。
.xxxLarge: 超大文本尺寸。
辅助功能尺寸
.accessibility1: 较小的辅助功能文本尺寸。
.accessibility2: 中等辅助功能文本尺寸。
.accessibility3: 大辅助功能文本尺寸。
.accessibility4: 非常大的辅助功能文本尺寸。
.accessibility5: 最大的辅助功能文本尺寸。
辅助功能尺寸适用于需要更大字体的用户,例如视力受限的用户。这些尺寸超出了标准范围。
方法和属性
1、isAccessibilitySize
检查是否属于辅助功能大小。
if dynamicTypeSize.isAccessibilitySize {
// Do something for accessibility sizes
}
2、比较大小
DynamicTypeSize 遵循 Comparable 协议,因此可以直接比较大小:
if dynamicTypeSize >= .large {
// Do something for larger text sizes
}
与 dynamicTypeSize(_:) 修饰符的区别
@Environment(\.dynamicTypeSize):
允许视图读取当前的动态类型设置。
dynamicTypeSize(_:):
修饰符,用于限制某个视图的支持范围。
例如:
Text("Hello, World!")
.dynamicTypeSize(.medium ... .xxLarge)
通过 @Environment(\.dynamicTypeSize),可以让应用根据用户的字体设置动态调整内容和布局,提供更好的用户体验。