如何在VisionOS的SwiftUI应用左侧添加菜单?
如何在VisionOS的SwiftUI应用左侧添加菜单?
嘿,我刚好踩过这个坑!你用NavigationView没效果太正常了——VisionOS的导航组件逻辑和iOS有差异,它更推荐用NavigationSplitView来实现左侧侧边栏菜单,比TabView更贴合你要的交互场景哦!
先给你说为啥NavigationView不行:VisionOS里的NavigationView是针对层级式的页面跳转(比如从列表点进详情),不是用来做侧边栏+主内容的分栏布局的。而NavigationSplitView是苹果专门为多窗口、多空间场景设计的分栏组件,天生适配VisionOS的交互逻辑。
给你贴个完整的示例代码,你直接就能跑起来看效果:
struct VisionSidebarView: View { // 记录当前选中的菜单项 @State private var selectedMenu: String? = "首页" // 菜单选项列表 private let menuItems = ["首页", "我的收藏", "设置", "帮助中心"] var body: some View { NavigationSplitView { // 左侧侧边栏菜单区域 List(menuItems, id: \.self, selection: $selectedMenu) { item in NavigationLink(value: item) { Text(item) } } .navigationTitle("菜单") } detail: { // 右侧主内容区域,根据选中项切换内容 if let selectedItem = selectedMenu { Text("当前展示的是「\(selectedItem)」页面") .navigationTitle(selectedItem) } else { Text("请选择一个菜单项") .navigationTitle("欢迎") } } // 可选:调整侧边栏的显示样式,.balanced是默认,.compact会让侧边栏默认折叠 .navigationSplitViewStyle(.balanced) } }
要是你想给菜单加图标、分组,让它更美观,也很简单,修改侧边栏的List部分就行:
List(selection: $selectedMenu) { Section("核心功能") { NavigationLink(value: "首页") { Label("首页", systemImage: "house") } NavigationLink(value: "我的收藏") { Label("我的收藏", systemImage: "star") } } Section("辅助设置") { NavigationLink(value: "设置") { Label("设置", systemImage: "gear") } NavigationLink(value: "帮助中心") { Label("帮助中心", systemImage: "questionmark.circle") } } }
至于你提到的TabView,它在VisionOS里主要是用来做同一层级的标签页切换,通常会显示在窗口的底部或者顶部,和你要的左侧固定菜单场景不太匹配,所以不建议用它来实现这个需求。
这个方案的好处是完全贴合VisionOS的系统交互规范,侧边栏会自动适配不同的窗口大小和空间场景——比如全屏时固定显示,小窗口时可以通过拖拽边缘或者点击按钮展开,用户体验会很顺畅。
备注:内容来源于stack exchange,提问作者János
相关产品推荐
相关产品推荐

