SwiftUI:特定的可访问性需求
SwiftUI为我们提供了许多环境属性,这些属性描述了用户的自定义可访问性设置,值得花些时间阅读并关注这些设置。
回到项目15 - 辅助功能,我们研究了可访问性标签和提示,特征,组等,但是这些设置是不同的,因为它们是通过环境提供的。这意味着SwiftUI会自动监视它们的更改,并在其中任何一个更改时重新调用我们的body
属性。
例如,可访问性选项之一是“不区分颜色”,这对于有色盲的12个男性中的1个很有帮助。启用此设置后,应用程序应尝试使用形状,图标和纹理(而不是颜色)使UI更加清晰。
要使用此功能,只需添加如下环境属性:
@Environment(\.accessibilityDifferentiateWithoutColor) var differentiateWithoutColor
这将是对还是错,您可以相应地调整UI。例如,在下面的代码中,我们将常规布局使用简单的绿色背景,但是启用“无色区分”后,我们将使用黑色背景并添加复选标记:
struct ContentView: View {
@Environment(\.accessibilityDifferentiateWithoutColor) var differentiateWithoutColor
var body: some View {
HStack {
if differentiateWithoutColor {
Image(systemName: "checkmark.circle")
}
Text("Success")
}
.padding()
.background(differentiateWithoutColor ? Color.black : Color.green)
.foregroundColor(Color.white)
.clipShape(Capsule())
}
}
您可以通过在“设置”应用中并选择 辅助功能 > 显示和文本大小 > 不以颜色区分 在模拟器中进行测试。
另一个常见的选项是“减弱动态效果”,在模拟器中的 辅助功能 > 动态效果 > 减弱动态效果 下同样可用。启用此功能后,应用程序应限制导致屏幕移动的动画数量。例如,iOS应用程序切换器使视图淡入和淡出,而不是放大和缩小。
使用SwiftUI,这意味着当涉及运动时,我们应该限制withAnimation()
的使用,如下所示:
struct ContentView: View {
@Environment(\.accessibilityReduceMotion) var reduceMotion
@State private var scale: CGFloat = 1
var body: some View {
Text("Hello, World!")
.scaleEffect(scale)
.onTapGesture {
if self.reduceMotion {
self.scale *= 1.5
} else {
withAnimation {
self.scale *= 1.5
}
}
}
}
}
我不知道你是怎么想的,但我觉得这个用起来挺烦的。幸运的是,我们可以在withAnimation()
周围添加一些包装函数,该函数直接使用UIKit 的 UIAccessibility
数据,从而使我们能够自动绕过动画:
func withOptionalAnimation<Result>(_ animation: Animation? = .default, _ body: () throws -> Result) rethrows -> Result {
if UIAccessibility.isReduceMotionEnabled {
return try body()
} else {
return try withAnimation(animation, body)
}
}
因此,如果启用了“减弱动态效果”,则立即执行传入的闭包代码,否则将使用withAnimation()
。整个throws/throwths
东西是更先进的Swift,但是它是withAnimation()
的函数签名的直接副本,因此两者可以互换使用。
像这样使用它:
struct ContentView: View {
@State private var scale: CGFloat = 1
var body: some View {
Text("Hello, World!")
.scaleEffect(scale)
.onTapGesture {
withOptionalAnimation {
self.scale *= 1.5
}
}
}
}
使用这种方法,您无需每次都重复动画代码。
您应该考虑支持的最后一个选择是“降低透明度”,启用该功能的应用程序应减少设计中使用的模糊和半透明性,以确保一切都清晰无误。
例如,当启用“减少透明度”时,此代码使用纯黑色背景,否则使用50%的透明度:
struct ContentView: View {
@Environment(\.accessibilityReduceTransparency) var reduceTransparency
var body: some View {
Text("Hello, World!")
.padding()
.background(reduceTransparency ? Color.black : Color.black.opacity(0.5))
.foregroundColor(Color.white)
.clipShape(Capsule())
}
}
这是我要您在构建真实项目之前要学习的最后一种技术,因此请将您的项目重置为原始状态,以便我们有一个清晰的开始。