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
可以附加到 Image
或 Button
。)
使用 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
}
}
}
我正在向我的 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
可以附加到 Image
或 Button
。)
使用 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
}
}
}