SwiftUI Focus VoiceOver на NavigationBarItem
Когда мое приложение открывает новое представление, я хочу, чтобы VoiceOver фокусировался на одном из элементов панели навигации. Я создал игрушечный пример, чтобы показать проблему.
import SwiftUI
import CoreData
struct SecondaryView: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
var body: some View {
VStack {
Button(action: {}) {
Text("Text1")
}
.overlay(RoundedRectangle(cornerRadius: 6).stroke(Color.red, lineWidth: 6))
.background(Color.green)
.font(.system(size: 54))
.padding(.all)
// .accessibility(sortPriority: 1) // This works as expected
Divider()
Button(action: {}) {
Text("Text2")
}
.overlay(RoundedRectangle(cornerRadius: 6).stroke(Color.red, lineWidth: 6))
.background(Color.green)
.font(.system(size: 54))
.padding(.all)
// this works as expected. If uncommented, Voice over focuses on Text2 when the view appears
// .accessibility(sortPriority: 2)
}
.navigationBarBackButtonHidden(true)
.navigationBarItems(
leading:
Button(action: {
self.presentationMode.wrappedValue.dismiss()
}) {
Image(systemName: "chevron.left")
.resizable()
.aspectRatio(contentMode: .fit)
.foregroundColor(.yellow)
.frame(width: 30.0, height: 30.0)
// .accessibility(sortPriority: 3)
Text("Back")
.font(.system(size: 27))
.foregroundColor(.yellow)
// .accessibility(sortPriority: 4) // This does not work (Is it because it is not part of VStack?)
},
trailing:
Text("Secondary View")
.font(.system(size: 27))
.foregroundColor(Color.black)
.multilineTextAlignment(.center)
.accessibility(sortPriority: 5) // This does not work
)
}
}
struct MainView: View {
@Environment(\.managedObjectContext) private var viewContext
var body: some View {
NavigationView {
VStack {
Text("Where everything begins")
.font(.system(size: 40))
.padding(.all)
Divider()
NavigationLink(destination: SecondaryView()) {
Text("Go to secondary View")
.font(.system(size: 40))
}
}
.navigationBarBackButtonHidden(true)
.navigationBarItems(
leading:
Button(action: {
}) {
Text("Main View")
.font(.system(size: 40))
.foregroundColor(Color.black)
.multilineTextAlignment(.center)
}
)
}
}
}
Шаги по воспроизведению проблемы:
- Когда приложение запускается, Voice Over фокусируется на заголовке "Main View".
- Когда пользователь нажимает "Перейти к дополнительному представлению", и приложение переходит к дополнительному представлению, Voice Over фокусируется на текстовых элементах внутри VStack в SecondaryView. Я могу сосредоточиться на Voice Over
Text1
или жеText2
с участиемaccessibility(sortPriority: )
, но я не могу сосредоточиться наSecondary View
заглавие. - Когда пользователь нажимает "Назад" и возвращается в главное представление, происходит та же картина: голос за кадром фокусируется на первом тексте внутри VStack, на этот раз
Where everything begins
.
Я безуспешно пытался решить эту проблему с помощью навигации BarItems и toolBarItems. Я использую Xcode 12 / iOS 14.
Есть идеи, как решить эту проблему в SwiftUI?
большое спасибо
Ура