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

Шаги по воспроизведению проблемы:

  1. Когда приложение запускается, Voice Over фокусируется на заголовке "Main View".
  2. Когда пользователь нажимает "Перейти к дополнительному представлению", и приложение переходит к дополнительному представлению, Voice Over фокусируется на текстовых элементах внутри VStack в SecondaryView. Я могу сосредоточиться на Voice Over Text1 или же Text2 с участием accessibility(sortPriority: ), но я не могу сосредоточиться на Secondary View заглавие.
  3. Когда пользователь нажимает "Назад" и возвращается в главное представление, происходит та же картина: голос за кадром фокусируется на первом тексте внутри VStack, на этот раз Where everything begins.

Я безуспешно пытался решить эту проблему с помощью навигации BarItems и toolBarItems. Я использую Xcode 12 / iOS 14.

Есть идеи, как решить эту проблему в SwiftUI?

большое спасибо

Ура

0 ответов

Другие вопросы по тегам