如何解决更改时如何使iOS VoiceOver读取Text元素不是当前焦点?
我正在尝试制作一个模拟Apple计算器应用程序行为的应用程序。在计算器上,当您点击=(等于)时,应用程序将从主显示视图读取“结果,数字。”。如何在SwiftUI中重现此行为?
我的测试场景:
SharedPreference
我希望每次结果更改时,通过“添加”或“减号”按钮的交互作用,VoiceOver系统都会检测到结果更改并读取结果。
解决方法
您只需在视图主体上使用accessibility(value:)
修饰符即可。
var body: some View {
VStack {
Text("\(result)")
.font(.largeTitle)
.frame(height: 100)
.padding()
Spacer()
Button(action: {
self.result += 1
},label: {
Text("Add one")
.font(.title)
.padding()
})
Button(action: {
self.result -= 1
},label: {
Text("Minus one")
.font(.title)
.padding()
})
}
.accessibility(value: Text("\(result)"))
}
,
您可以发布语音通知的通知以宣布某些内容。但是我不熟悉SwiftUI,所以不确定将代码放置在示例中的最佳位置
发布通知的代码为:
if UIAccessibility.isVoiceOverRunning {
UIAccessibility.post(notification: .announcement,argument: "message to announce")
}
也许您可以这样:
function announceResult() {
if UIAccessibility.isVoiceOverRunning {
UIAccessibility.post(notification: .announcement,argument: self.result)
}
}
Button(action: {
self.result += 1
announceResult()
}
,
这是我的最终解决方案:
struct ContentView: View {
@State var result = 0 {
didSet {
announce(this: "\(result)")
}
}
var body: some View {
VStack {
Text("\(result)")
.font(.largeTitle)
.frame(height: 100)
.padding()
Spacer()
Button(action: {
self.result += 1
},label: {
Text("Minus one")
.font(.title)
.padding()
})
}
//.accessibility(value: Text("\(result)"))
}
private func announce(this: String) {
if UIAccessibility.isVoiceOverRunning {
UIAccessibility.post(notification: .screenChanged,argument: "The new result is \(this).")
}
}
}
我正在寻找的通知是.screenChanged,但我也想使用@Scriptable提及的.announcement。
有时候,您必须使用DispatchQueue.main.asyncAfter解决竞争条件,如Why is UIAccessibility.post(notification: .announcement,argument: "arg") not announced in voice over?
所述在这里我找到了其他通知:Default UIAccessibilityElement after screen change
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。