美文网首页Hacking with iOS: SwiftUI Edition
SwiftUI:特定的可访问性需求

SwiftUI:特定的可访问性需求

作者: 韦弦Zhy | 来源:发表于2020-10-17 14:29 被阅读0次

    \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

    相关文章

      网友评论

        本文标题:SwiftUI:特定的可访问性需求

        本文链接:https://www.haomeiwen.com/subject/azuppktx.html