SwiftUI: запуск трехколоночного приложения для iPad с видимой боковой панелью

#swiftui #swiftui-list #swiftui-navigationview

#swiftui #swiftui-список #swiftui-navigationview

Вопрос:

Используя приведенный ниже код, можно создать базовый макет iPad с тремя столбцами.

 @main
struct threepanelApp: App {
    var body: some Scene {
        WindowGroup {
            NavigationView {
                List(0..<10, rowContent: { i in
                    Text(String(describing: i))
                })
                .listStyle(SidebarListStyle())
                .navigationTitle("One")
                
                List(10..<20, rowContent: { i in
                    Text(String(describing: i))
                })
                .navigationTitle("Two")

                VStack {
                    Text("Panel Three")
                }
                .navigationTitle("Three")
            }
        }
    }
}
 

Однако, когда приложение запускается, оно делает это в двухколоночном макете.

Двухколоночное

Чего я хотел бы добиться, так это запуска приложения в трехколоночном макете:

Трехколоночное

Возможно ли это с SwiftUI 2?

Комментарии:

1. Я не думаю, что это возможно при текущем NavigationView поведении по умолчанию. Что вы можете сделать, так это создать свои собственные столбцы HStack и поработать с GeometryReader ними.

2. @egeeke Я нашел способ сделать это (см. Ответ ниже).

Ответ №1:

Придумал хакерский способ сделать это:

Погрузитесь UIKit в . onAppear , найдите UISplitViewController и установите его preferredDisplayMode .

 var body: some Scene {
        WindowGroup {
            NavigationView {
                List(0..<10, rowContent: { i in
                    Text(String(describing: i))
                })
                .navigationTitle("One")

                ListTwo()

                VStack {
                    Text("Panel Three")
                }
                .navigationTitle("Three")
            }.onAppear {
                let controller = UIApplication.shared.windows.first { $0.isKeyWindow }!.rootViewController
                guard let split = controller?.children[0] as? UISplitViewController else {
                    print("not a split view")
                    return
                }
                split.preferredDisplayMode = .twoBesideSecondary
            }
        }
    }
 

Ответ №2:

при добавлении этого расширения все расширяется при запуске приложения:

 extension UISplitViewController {

    open override func viewDidLoad() {
        super.viewDidLoad()
        preferredDisplayMode = .twoBesideSecondary
    }
}