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

macOS 15中含SwiftUI内容的NSWindow框架归零问题求助

解决方案

核心思路

macOS 15(Sequoia)中NSHostingController与NSWindow的框架协调逻辑有变化,若SwiftUI根视图无明确尺寸约束,窗口框架会被意外重置。只需在SwiftUI中定义一次固定尺寸,再让窗口基于视图尺寸适配位置即可。

具体实现步骤

  1. 在SwiftUI根视图中定义固定尺寸
    在WelcomeView中通过.frame修饰器锁定尺寸,确保视图有明确的固有尺寸:

    struct WelcomeView: View {
        var body: some View {
            // 你的视图内容
            Text("Welcome")
                .frame(minWidth: 600, maxWidth: 600, minHeight: 400, maxHeight: 400)
        }
    }
    
  2. 创建窗口并绑定HostingController,适配位置
    先将HostingController赋值给窗口,再基于视图的固有尺寸设置窗口完整框架(无需提前硬编码窗口尺寸):

    // 创建窗口(初始contentRect设为.zero即可)
    let onboardWindow = NSWindow(
        contentRect: .zero,
        styleMask: [.titled, .closable, .resizable],
        backing: .buffered,
        defer: false
    )
    // 创建HostingController
    let hostingController = NSHostingController(rootView: WelcomeView())
    onboardWindow.contentViewController = hostingController
    
    // 获取视图固有尺寸,设置窗口完整框架
    let viewSize = hostingController.view.intrinsicContentSize
    onboardWindow.setFrame(NSRect(x: 0, y: 0, width: viewSize.width, height: viewSize.height), display: true)
    

更简洁的替代写法

如果无需精细控制窗口创建流程,也可以直接让窗口自动适配SwiftUI视图尺寸,再调整位置:

let onboardWindow = NSWindow(
    contentRect: .zero,
    styleMask: [.titled, .closable, .resizable],
    backing: .buffered,
    defer: false
)
onboardWindow.contentViewController = NSHostingController(rootView: WelcomeView())
onboardWindow.contentSize = onboardWindow.contentViewController?.view.intrinsicContentSize ?? .zero
onboardWindow.setFrameOrigin(NSPoint(x: 0, y: 0))

这样只需在SwiftUI视图中定义一次尺寸,无需重复硬编码窗口参数,同时解决了macOS 15中框架被重置的问题。

内容的提问来源于stack exchange,提问作者Vojta Böhm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:10:10