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 } }
解答
VisionOS不支持AppKit
AppKit是macOS专属的UI框架,VisionOS基于UIKit和SwiftUI构建,不存在NSWindow、NSWindowDelegate这类AppKit专属类,因此导入AppKit会报错,也无法使用相关类型。获取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
相关产品推荐
相关产品推荐

