SwiftUI macOS 13应用NavigationSplitView窗口自适应问题
要让窗口随选中的详情视图自动调整尺寸,你需要在切换视图时主动触发窗口重新计算内容大小,结合明确的视图尺寸约束来实现,具体修改如下:
1. 给无固定尺寸的详情视图添加明确尺寸约束
你的PeachView没有设置固定宽高,窗口无法感知其合适尺寸,先补充约束:
struct PeachView: View { var body: some View { Text("Peach View 🍑") .font(.title) .background(.pink) .frame(width: 350, height: 250) // 添加固定尺寸,可根据需求调整 } }
2. 在选中项变化时触发窗口尺寸调整
在ContentView中添加onChange修饰符,当选中的水果切换时,获取当前窗口并强制其调整到内容适配的大小:
struct ContentView: View { @State private var selectedFruit: Fruit = .apple var body: some View { NavigationSplitView { List(Fruit.allCases, id: \.self, selection: $selectedFruit) { fruit in Text(fruit.rawValue) } } detail: { switch selectedFruit { case .apple: AppleView() case .kiwi: KiwiView() case .peach: PeachView() } } .onChange(of: selectedFruit) { _ in // 获取当前激活的窗口 guard let keyWindow = NSApplication.shared.windows.first(where: { $0.isKeyWindow }) else { return } // 计算内容视图的适配尺寸并设置给窗口 keyWindow.setContentSize(keyWindow.contentView?.fittingSize ?? NSSize(width: 400, height: 300)) } } }
原理说明
- 你之前设置的
.windowResizability(.contentSize)只是允许窗口根据内容调整大小,但不会自动触发调整动作; NavigationSplitView默认会保持当前窗口尺寸,即使详情视图尺寸变化也不会主动通知窗口更新;- 通过
onChange监听选中项变化,主动调用setContentSize让窗口重新计算并应用内容的适配尺寸,就能实现切换视图时窗口自动调整的效果。
内容的提问来源于stack exchange,提问作者wigging
相关产品推荐
相关产品推荐

