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

Xcode15.2中VisionOS项目无法使用AppKit,如何获取窗口尺寸?

问题

环境:Xcode 15.2,VisionOS项目
尝试获取用户调整大小后的VisionOS窗口宽高,原本打算用NSWindowDelegate(NSWindow相关类)实现,但导入AppKit时收到报错:"No such module 'AppKit'",同时代码里的NSWindowController、NSWindowDelegate、NSSize等类型都提示找不到。

疑问:

  • VisionOS是否不支持AppKit?
  • 在VisionOS上使用NSWindow类是否需要导入其他模块?
  • 如果没有相关支持,该如何获取VisionOS中已有窗口的尺寸?

附上代码:

import AppKit //"No such module 'AppKit'"

class CustomWindowManager: NSWindowController, NSWindowDelegate { //"Cannot find type 'NSWindowController' or 'NSWindowDelegate' in scope"

       // Resize Methods

       func windowWillResize(sender: NSWindow,toSize frameSize: NSSize) -> NSSize { //"Cannot find type 'NSSize' or 'NSWindow' in scope"

            // my code goes here
       }

       func windowDidResize(notification: NSNotification) {

           // my code goes here
       }
}
解答
  1. VisionOS不支持AppKit
    AppKit是macOS专属的UI框架,VisionOS基于UIKit和SwiftUI构建,不存在NSWindow、NSWindowDelegate这类AppKit专属类,因此导入AppKit会报错,也无法使用相关类型。

  2. 获取VisionOS窗口尺寸的替代方案

方案一:SwiftUI视图内直接获取(推荐)

使用GeometryReader读取当前视图所在窗口的尺寸,还能监听尺寸变化:

struct YourView: View {
    var body: some View {
        GeometryReader { geometryProxy in
            VStack {
                Text("当前窗口宽:\(geometryProxy.size.width),高:\(geometryProxy.size.height)")
            }
            .onChange(of: geometryProxy.size) { newSize in
                // 窗口尺寸变化时执行自定义逻辑
                print("窗口调整后尺寸:\(newSize)")
            }
        }
    }
}

方案二:通过UIKit监听窗口变化

导入UIKit后,利用UIWindowScene获取窗口尺寸并监听变化:

import UIKit

class WindowSizeMonitor {
    init() {
        // 注册窗口尺寸变化通知
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(windowSizeChanged(_:)),
            name: UIWindowScene.didChangeSizeNotification,
            object: nil
        )
    }

    @objc private func windowSizeChanged(_ notification: Notification) {
        guard let windowScene = notification.object as? UIWindowScene else { return }
        let newSize = windowScene.size
        print("窗口新尺寸:\(newSize.width) x \(newSize.height)")
        // 在这里执行你的调整逻辑
    }

    // 获取当前窗口尺寸
    func currentWindowSize() -> CGSize? {
        guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else {
            return nil
        }
        return windowScene.size
    }
}

内容的提问来源于stack exchange,提问作者Shane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 10:50:28