如何实现iPad横屏移除NavigationSplitView侧边栏切换按钮(竖屏保留)
你的代码核心问题是首次启动时未获取当前实际屏幕方向,isPortrait初始值固定为true,导致横屏启动时按钮无法正确隐藏。以下是修正后的实现,完美匹配iOS17“家庭”应用的逻辑:
struct SidebarMainView: View { @State private var isPortrait = false var body: some View { NavigationSplitView { List { Text("1") Text("2") Text("3") } .listStyle(SidebarListStyle()) .toolbar(removing: isPortrait ? .none : .sidebarToggle) .navigationTitle("HP") // 首次加载时获取当前方向 .onAppear { updatePortraitStatus() } // 监听方向变化更新状态 .onReceive(NotificationCenter.default.publisher(for: UIDevice.orientationDidChangeNotification)) { _ in updatePortraitStatus() } } detail: { Text("Select a department: \(isPortrait ? "yes" : "no")") } } // 统一更新屏幕方向状态的方法 private func updatePortraitStatus() { // 改用connectedScenes获取当前场景,适配多场景模式 guard let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene else { return } isPortrait = scene.interfaceOrientation.isPortrait } }
关键修改点:
- 初始化方向修正:添加
.onAppear回调,首次启动时主动获取当前屏幕方向,避免初始值错误 - 场景获取优化:用
connectedScenes替代windows.first,适配iOS13+的多窗口场景模式 - 代码复用:将方向判断逻辑抽为私有方法,减少重复代码,提升可维护性
这样修改后,无论首次启动是横屏还是竖屏,侧边栏切换按钮都会正确显示/隐藏,方向切换时也能实时响应。
内容的提问来源于stack exchange,提问作者Oskar Persson
相关产品推荐
相关产品推荐

