You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI macOS 13应用NavigationSplitView窗口自适应问题

解决macOS SwiftUI 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:10:31