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