我的屏幕上有一个按钮。当用户点击该按钮时,我的应用程序会打开一个模式(视图)。当用户关闭该视图时,辅助功能 VoiceOver 的焦点将转到屏幕顶部。在 UIKit 中,我可以使用 UIAccessibility.post(notification:argument:) 将 .layoutChanged 传递到
notification
参数中,并将对我的视图之一的引用传递到 argument
参数中。我怎样才能在 SwiftUI 中实现同样的行为?
我的管理方法是在父视图的最顶层使用
.accessibilityHidden
包装器,然后使用 @State 变量作为传递给 accessibilityHidden
的值。这样,在显示模式时,父视图将被忽略。然后在模态再次关闭后重新引入视图。
struct MainView: View {
@State var showingModal = false
var body: some View {
VStack {
Button(action: {
showingModal = true
}, label: {
Text("Open Modal")
})
.fullScreenCover(isPresented: $showingModal, onDismiss: {
print("Focus coming back to main view")
} content: {
Modal()
})
}
.accessibilityHidden(self.showingModal)
}
}
struct Modal: View {
@Environment(\.presentationMode) var presentationMode
var body: some View {
VStack {
Text("Focus will move here")
Button(action: {
presentationMode.wrappedValue.dismiss()
}) {
Text("Close Modal to Refocus Back")
}
}
}
}
您还可以链接多个模式/警报,只要您有 @State 值来处理对它们的更改,以便焦点正确移动
.accessibilityHidden(self.showingModel1 || self.showingModel2 || self.showingAlert1 || self.showingAlert2)
我知道这个问题确实很老了,但我实际上只是在处理这个问题,并认为如果其他人偶然发现这个问题,这里就会有答案。