ToolbarItem 中 Button 中图像的可访问性

Accessibility of Image in Button in ToolbarItem

我正在向我的 SwiftUI 应用程序添加辅助功能,直到我在 ToolbarItem 中将 accessibilityLabel(_:) 添加到 Button 时遇到问题。这是一些示例代码:

struct ContentView: View {
    
    var body: some View {
        NavigationView {
            Text("Content")
                .accessibilityElement()
                .accessibilityLabel("Content label") // This is here just to show Voice Control is working
                .navigationTitle("Test")
                .toolbar {
                    // Comment parts out below, depending on what you want to test
                    ToolbarItem(placement: .navigationBarTrailing) {
                        // What I want, but doesn't work:
                        // (Also tried adding the label to either the button
                        // label or the whole button itself, neither works.)
                        Button {
                            print("Pressed")
                        } label: {
                            Image(systemName: "plus")
                                .accessibilityElement()
                                .accessibilityLabel("Some label")
                        }
                        .accessibilityElement()
                        .accessibilityLabel("Some other label")
                        
                        // What I don't want, but does work:
                        Image(systemName: "plus")
                            .accessibilityLabel("Another label")
                    }
                }
        }
    }
}

我正在测试语音控制的可访问性。奇怪的是,可访问性标签适用于工具栏项中的图像,但不适用于工具栏项中的按钮。

当我说辅助功能标签不起作用时,它说的是 "Add" 而不是预期的标签。我假设 SwiftUI 默认为系统图像“plus”创建此标签,但我想更改它。

按钮辅助功能标签在不在工具栏项中时也有效。这是错误,还是我造成的问题?

SwiftUI 以不同方式处理单个工具栏项(应用它们自己的样式、大小等)。看起来这也适用于辅助功能标签。

幸运的是,有一个解决方法 - 请参阅

在您的情况下,代码应如下所示:

.toolbar {
    ToolbarItem(placement: .navigationBarTrailing) {
        HStack {
            Text("")
                .accessibilityHidden(true)
            
            Button {
                print("Pressed")
            } label: {
                Image(systemName: "plus")
                    .accessibilityElement()
                    .accessibilityLabel("Some label")
            }
        }
    }
}

accessibilityLabel 可以附加到 ImageButton。)

使用 Xcode 12.3、iOS 14.3 测试。

更新:此问题已针对 iOS 15+ 修复。

我的雷达有 'Less than 10' 类似的报告,但现在实际上已修复 iOS 15+。但是,如果您支持旧版本,请参阅上面@pawello2222 的回答,这里是更新版本,仅在必要时执行解决方法:

/// Embeds the content in a view which removes some
/// default styling in toolbars, so accessibility works.
/// - Returns: Embedded content.
@ViewBuilder func embedToolbarContent() -> some View {
    if #available(iOS 15, *) {
        self
    } else {
        HStack(spacing: 0) {
            Text("")
                .frame(width: 0, height: 0)
                .accessibilityHidden(true)

            self
        }
    }
}