SwiftUI:使用 Sidebar Visible 启动三列 iPad 应用程序

Posted

技术标签:

【中文标题】SwiftUI:使用 Sidebar Visible 启动三列 iPad 应用程序【英文标题】:SwiftUI: Launching three column iPad app with the Sidebar Visible 【发布时间】:2021-02-14 09:36:02 【问题描述】:

使用下面的代码可以创建一个基本的三栏 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 可以做到吗?

【问题讨论】:

我认为当前默认的NavigationView 行为是不可能的。您可以做的是使用HStack 制作自己的专栏,并使用GeometryReader 制作一些专栏。 @eeeke 我想出了一个方法来做到这一点(见下面的答案)。 【参考方案1】:

想出了一个 hacky 方法来做到这一点:

在 .onAppear 中搜索UIKit,找到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
    

【讨论】:

以上是关于SwiftUI:使用 Sidebar Visible 启动三列 iPad 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 中具有不同列的侧边栏

css Genesis Swap将Primary Sidebar放入Secondary Sidebar位置(最好使用CSS)

css Genesis Swap将Primary Sidebar放入Secondary Sidebar位置(最好使用CSS)

wordpress侧边栏小工具判断函数is_active_sidebar()

WordPress侧边栏(sidebar)的使用

如何取得DevComponents.DotNetBar.SideBar