【问题标题】:Docked Sidebar on iPad in portrait orientation with SwiftUI使用 SwiftUI 在 iPad 上纵向停靠侧边栏
【发布时间】:2021-05-01 21:33:52
【问题描述】:

SwiftUI 为您提供了有用的 NavigationView,它让您可以轻松地为 iPad 应用程序定义边栏和主要内容,以便在 iPhone 上自动折叠。

我有一个应用程序,一切正常,除了在 iPad 上,在纵向模式下,侧边栏默认隐藏,你必须点击一个按钮才能显示它。

我想要的只是强制侧边栏始终可见,即使在纵向模式下也是如此。并使其工作方式与设置应用程序相同。

我什至愿意使用为 SwiftUI 包装的 UIKit 视图,但包装 NavigationController 似乎非常非常具有挑战性。

有没有更好的办法?

【问题讨论】:

标签: swift swiftui uinavigationcontroller


【解决方案1】:

如果没有您的具体代码,我无法确定,但我认为您正在描述 iPad 上显示的初始屏幕。这实际上是一个“第三视图”。您可以使用下面的代码查看它。

我正在回答您问题的“更好的方式”部分。这对我来说是一种“优雅地”处理它的方式。

struct VisibleSideBar2: View {
    var body: some View {
        NavigationView{
            List(0..<10){ idx in
                NavigationLink("SideBar \(idx)", destination: Text("Secondary \(idx)"))
            }
            Text("Welcome Screen")
        }
    }
}

如果您在“辅助视图”中有默认选择,则更加明显,因为现在您必须单击“返回”两次才能进入侧边栏

struct VisibleSideBar1: View {
    @State var selection: Int? = 1
    var body: some View {
        NavigationView{
        List(0..<10){ idx in
            NavigationLink(
                destination: Text("Secondary \(idx)"),
                tag: idx,
                selection: $selection,
                label: {Text("SideBar \(idx)")})
        }
            Text("Third View")
        }
    }
}

为此,很多“解决方案”只是将NavigationView 变成Stack,但是您无法获得双列。

处理它的一种方法是VisibleSideBar2 中描述的内容。您可以制作/拥抱一个漂亮的“欢迎屏幕”,这样用户就不会受到空白屏幕的欢迎,然后自然的导航本能就会启动。您只能在 iPad Portrait 和 Catalyst/MacOS 上看到“欢迎屏幕”,其中 Stack 是不可用。

或者您可以通过在NavigationLink 中使用isActive 并将Sidebar 用作View 之类的菜单来绕过第三个屏幕

struct VisibleSidebar3: View{
    @State var mainIsPresented = true
    var body: some View {
        NavigationView {
            ScrollView{
                NavigationLink(
                    destination: Text("Main View").navigationTitle("Main"),
                    isActive: $mainIsPresented,
                    label: {
                        Text("Main View")
                    })
                NavigationLink("List View", destination: ListView())
                
            }.navigationTitle("Sidebar")
            //Not visible anymore
            Text("Welcome Screen")
        }
    }
}
struct ListView: View{
    var body: some View {
        List(0..<10){ idx in
            NavigationLink("SideBar \(idx)", destination: Text("Secondary \(idx)"))
        }.navigationTitle("List")
        
    }
}

就像我说的那样,我的回答并不是真正“解决”问题的方法。只是处理它。要修复它,我们将不得不以某种方式关闭“第三屏幕/欢迎屏幕”。然后操作剩余的UISplitViewController(关于此的几个 SO 问题)以显示 SideBar/Master 和 Detail View。

UIKit 中似乎做了很多,如果你搜索SO,你会找到一种方法来创建一个行为类似于SettingsUISplitViewController

【讨论】:

  • 谢谢,UISplitViewController 部分可能是对我最有帮助的部分。我的问题不是我没有一个好的开始屏幕。我不希望菜单栏永远隐藏,即使在纵向模式下也是如此。看起来现在仅使用 SwiftUI 是不可能的。我现在就等 WWDC。
猜你喜欢
  • 2021-10-18
  • 2021-02-04
  • 2020-10-26
  • 2012-01-18
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 2021-04-16
  • 2020-11-11
相关资源
最近更新 更多