微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

更改时如何使iOS VoiceOver读取Text元素不是当前焦点?

如何解决更改时如何使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 举报,一经查实,本站将立刻删除。