MacOS SwiftUI nagivation для одного представления - PullRequest
2 голосов
/ 25 апреля 2020

Я пытаюсь создать представление настроек для моего приложения в строке состояния MacOS swiftUI. Моя реализация до сих пор использовала NavigationView и NavigationLink, но это решение создает половинное представление, поскольку представление настроек смещает родительское представление в сторону. Снимок экрана и пример кода ниже.

Снимок экрана - Боковая панель навигации

struct ContentView: View {
    var body: some View {
        VStack{
            NavigationView{
            NavigationLink(destination: SecondView()){
                Text("Go to next view")
                }}
        }.frame(width: 800, height: 600, alignment: .center)}
}

struct SecondView: View {
    var body: some View {
        VStack{

                Text("This is the second view")

        }.frame(width: 800, height: 600, alignment: .center)
    }
}

Небольшая информация, которую я могу найти, говорит о том, что это неизбежно при использовании SwiftUI на MacOS, "полный" Представление nagivation для экрана iOS недоступно в macOS.

Существует ли простой или даже сложный способ осуществить переход к представлению настроек, которое занимает весь кадр в SwiftUI для MacOS? А если нет, то можно ли использовать AppKit для вызова объекта View, написанного на SwiftUI?

Также новичок Swift ie - пожалуйста, будьте осторожны.

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Вот простая демонстрация возможного подхода для пользовательского навигационного решения. Протестировано с Xcode 11.4 / macOS 10.15.4

demo

Примечание: цвета фона используются для лучшей видимости.

struct ContentView: View {
    @State private var show = false
    var body: some View {
        VStack{
            if !show {
                RootView(show: $show)
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
                    .background(Color.blue)
                    .transition(AnyTransition.move(edge: .leading)).animation(.default)
            }
            if show {
                NextView(show: $show)
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
                    .background(Color.green)
                    .transition(AnyTransition.move(edge: .trailing)).animation(.default)
            }
        }
    }
}

struct RootView: View {
    @Binding var show: Bool
    var body: some View {
        VStack{
            Button("Next") { self.show = true }
            Text("This is the first view")
        }
    }
}

struct NextView: View {
    @Binding var show: Bool
    var body: some View {
        VStack{
            Button("Back") { self.show = false }
            Text("This is the second view")
        }
    }
}
0 голосов
/ 25 апреля 2020

Вы можете получить полноэкранную навигацию с помощью

 .navigationViewStyle(StackNavigationViewStyle())
...