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

如何在Swift中编程获取当前Mac系统窗口的位置/原点

问题原因

你当前代码读取的是NSViewController持有的view在其父视图坐标系下的相对坐标,如果这个view是窗口的根内容视图,它在父容器中的origin默认就是(0,0),所以输出恒为0,完全符合预期,并不是代码写错了,而是你取错了坐标对象和坐标系。

正确实现方案

核心逻辑

要获取窗口在屏幕上的实际坐标,需要先拿到view关联的NSWindow实例,再读取它在屏幕坐标系下的frame值。注意不要在viewDidLoad等view还没添加到窗口的生命周期阶段调用方法,此时view.window会返回nil,无法拿到有效数据,建议在viewDidAppear及之后的阶段调用。

代码示例

class ViewController: NSViewController {
    func getCoordinate() {
        guard let window = self.view.window else {
            print("view尚未绑定到窗口,请延后调用时机")
            return
        }
        // 窗口在屏幕坐标系的坐标(macOS原点在屏幕左下角)
        let windowOrigin = window.frame.origin
        print("窗口左下角坐标 x: \(windowOrigin.x), y: \(windowOrigin.y)")
        
        // 可选:如果需要获取当前view在屏幕上的坐标,用坐标系转换
        let viewOriginInScreen = self.view.convert(self.view.bounds.origin, to: nil)
        print("view在屏幕左下角坐标 x: \(viewOriginInScreen.x), y: \(viewOriginInScreen.y)")
        
        // 可选:转换为以屏幕左上角为原点的坐标(适配常见使用习惯)
        if let screenHeight = NSScreen.main?.frame.height {
            let topLeftY = screenHeight - window.frame.maxY
            print("窗口左上角坐标 x: \(windowOrigin.x), y: \(topLeftY)")
        }
    }

    // 正确的调用时机示例
    override func viewDidAppear() {
        super.viewDidAppear()
        getCoordinate()
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 08:09:03