Hacking with iOS: SwiftUI Edition

SwiftUI:特定的可访问性需求

2020-10-17  本文已影响0人  韦弦Zhy

\color{red}{\Large \mathbf{Hacking \quad with \quad iOS: SwiftUI \quad Edition}}

{\Large \mathbf{Flashzilla}}

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())
    }
}

这是我要您在构建真实项目之前要学习的最后一种技术,因此请将您的项目重置为原始状态,以便我们有一个清晰的开始。

译自 Supporting specific accessibility needs with SwiftUI

上一篇下一篇

猜你喜欢

热点阅读