在 iOS 中,根据焦点方向更改 UIView 元素的辅助功能文本

问题描述 投票:0回答:1

UIView 的可访问性文本是否可以根据其接收焦点的方向进行更改。

示例:

我有一个如下所示的布局,顶部标签,然后是集合视图,然后是底部标签。

enter image description here

集合视图有 4 个单元格(对于本示例),并且这些单元格启用了 isAccessibilityElement,因此 Voice over 可以读取每个单元格的内容,而不是整个集合视图。

这个集合视图基本上是一个包含行和列的表格。

当 Voice Over (VO) 焦点从“顶部标签”转移(顶部 -> 底部)到“单元格 1”时,“单元格 1”的辅助功能文本应为 ',表格,包含 n 行、n 列>' 当焦点遍历集合视图中的其他单元格时,它只会分别读取该单元格的辅助功能标签。

查询: 当 VO 的焦点从“单元格 4”转移(底部 -> 顶部)到“底部标签”时,单元格 4 的可访问文本可以是 ',表格,n 行,n 列>' 而不是其内容.

ios swift accessibility focus
1个回答
0
投票

UIView 的辅助功能文本无法根据其接收到的焦点方向进行更改。

存在三个问题:

  1. 辅助功能焦点与实际可聚焦的元素(例如接收键盘输入的文本字段)对齐,而不是与 VoiceOver 光标当前位置对齐。
  2. VoiceOver 光标不仅可以访问下一个/上一个字段,还允许您通过拖动手指立即跳转到特定项目,这样您就可以到达特定项目,而无需访问其后继/前继。
  3. 最好不要用几何形状(列和行)来表达项目,因为它可以根据字体大小而变化,并且此类细节不具有语义相关性。

我建议更改要宣布的项目,并提示“1 of 5”或“x of 5”。 这意味着当您访问该项目时,它只会显示“1”,然后短暂暂停后,它会显示“1 of 5”。

这是执行此操作的示例:

import SwiftUI

struct ContentView: View {
    
    var body: some View {
        VStack {
            ZStack {
                Rectangle()
                    .frame(height: 40)
                    .foregroundStyle(.orange)
                Text("Top Label")
            }
                .background(.orange)
                .frame(height: 100)
                .cornerRadius(10)
            MyCollectionView()
                .background(.gray)
            ZStack {
                Rectangle()
                    .frame(height: 40)
                    .foregroundStyle(.orange)
                Text("Bottom Label")

            }
        }
        .padding()
    }
}

struct MyCollectionView: View {
    static var items = [1, 2, 3, 4, 5]
    
    @AccessibilityFocusState private var isFocused: Bool

    var body: some View {
        ScrollView {
            LazyVGrid(columns: [GridItem(.adaptive(minimum: 100))]) {
                ForEach(MyCollectionView.items, id: \.self) { item in
                    MyCollectionItem(item: item)
                }
            }
            .padding(40)
        }
    }
}

struct MyCollectionItem: View {
    let item: Int
    @State
    var value: String = ""
    
    var body: some View {
        ZStack {
            Rectangle()
                .foregroundColor(.blue)
                .frame(height: 100)
                .cornerRadius(10)
            Text(String(item))
                .accessibilityHint("\(item) of \(MyCollectionView.items.count)")
        }
        
    }
}

#Preview {
    ContentView()
}

这是使用底部 VoiceOver 文本框拍摄的屏幕截图,以便您可以看到所说的内容: enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.