如何在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
相关产品推荐
相关产品推荐

