如何在 SwiftUI 中使用 UIAccessibility.post(notification: .layoutChanged, argument: nil) 将焦点移动到特定视图?

问题描述 投票:0回答:1

我的屏幕上有一个按钮。当用户点击该按钮时,我的应用程序会打开一个模式(视图)。当用户关闭该视图时,辅助功能 VoiceOver 的焦点将转到屏幕顶部。在 UIKit 中,我可以使用 UIAccessibility.post(notification:argument:).layoutChanged 传递到

notification
参数中,并将对我的视图之一的引用传递到
argument
参数中。我怎样才能在 SwiftUI 中实现同样的行为?

ios swift swiftui accessibility voiceover
1个回答
1
投票

我的管理方法是在父视图的最顶层使用

.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)

我知道这个问题确实很老了,但我实际上只是在处理这个问题,并认为如果其他人偶然发现这个问题,这里就会有答案。

© www.soinside.com 2019 - 2024. All rights reserved.