SwiftUI 是否支持按首选字体大小的替代布局?
Does SwiftUI support alternate layouts by preferred font size?
理想情况下,iOS 应用使用的字体大小应遵循用户系统范围的字体大小设置。该主题在 2017 年的 WWDC 演讲中有所涉及,该演讲名为 使用动态类型构建应用程序。
在简单的情况下,您可以使用 body
、caption1
、title
等命名样式设置 UIView
的字体,这些字体的大小取决于用户的设置。
在更棘手的情况下,您需要为不同的字体大小编写不同的自动布局约束。例如,当字体较大时,水平堆叠的标签可能需要变为垂直堆叠。
对于这种情况,WWDC 谈话显示了一些这样的代码:
if traitCollection.preferredContentSizeCategory > .extraExtraLarge {
NSLayoutConstraint.deactivate( horizontalConstraints )
NSLayoutConstraint.activate( verticalConstraints )
} else {
NSLayoutConstraint.deactivate( verticalConstraints )
NSLayoutConstraint.activate( horizontalConstraints )
}
在 SwiftUI 中与此等效的是什么?
我能想到的最接近的是这样的:
struct ContentView: View {
@Environment(\.sizeCategory) var sizeCategory: ContentSizeCategory
let largeSizeCategories: [ContentSizeCategory] = [.extraExtraLarge,
.extraExtraExtraLarge,
.accessibilityMedium,
.accessibilityLarge,
.accessibilityExtraLarge,
.accessibilityExtraExtraLarge,
.accessibilityExtraExtraExtraLarge]
var body: some View {
Group {
if largeSizeCategories.contains(sizeCategory) {
VStack {
Text("Pizza, bananas, donuts")
Text("Io, Europa, Ganymede")
}
} else {
HStack {
Text("Pizza, bananas, donuts")
Text("Io, Europa, Ganymede")
}
}
}
}
}
从 Environment
中获取 ContentSizeCategory
并根据值调整视图。
理想情况下,iOS 应用使用的字体大小应遵循用户系统范围的字体大小设置。该主题在 2017 年的 WWDC 演讲中有所涉及,该演讲名为 使用动态类型构建应用程序。
在简单的情况下,您可以使用 body
、caption1
、title
等命名样式设置 UIView
的字体,这些字体的大小取决于用户的设置。
在更棘手的情况下,您需要为不同的字体大小编写不同的自动布局约束。例如,当字体较大时,水平堆叠的标签可能需要变为垂直堆叠。
对于这种情况,WWDC 谈话显示了一些这样的代码:
if traitCollection.preferredContentSizeCategory > .extraExtraLarge {
NSLayoutConstraint.deactivate( horizontalConstraints )
NSLayoutConstraint.activate( verticalConstraints )
} else {
NSLayoutConstraint.deactivate( verticalConstraints )
NSLayoutConstraint.activate( horizontalConstraints )
}
在 SwiftUI 中与此等效的是什么?
我能想到的最接近的是这样的:
struct ContentView: View {
@Environment(\.sizeCategory) var sizeCategory: ContentSizeCategory
let largeSizeCategories: [ContentSizeCategory] = [.extraExtraLarge,
.extraExtraExtraLarge,
.accessibilityMedium,
.accessibilityLarge,
.accessibilityExtraLarge,
.accessibilityExtraExtraLarge,
.accessibilityExtraExtraExtraLarge]
var body: some View {
Group {
if largeSizeCategories.contains(sizeCategory) {
VStack {
Text("Pizza, bananas, donuts")
Text("Io, Europa, Ganymede")
}
} else {
HStack {
Text("Pizza, bananas, donuts")
Text("Io, Europa, Ganymede")
}
}
}
}
}
从 Environment
中获取 ContentSizeCategory
并根据值调整视图。