在Objective-C(OS X)中,Quartz Display Services使用的“全局显示”坐标空间与Cocoa的“屏幕”坐标空间相同吗?

时间:2013-11-09 23:19:41

标签: objective-c macos cocoa coordinates quartz-graphics

我正在尝试为我的应用程序创建一个图像“放大镜”,可以用来检查不同放大倍率的图像,我遇到了一些路障。我正在使用Quartz为我的应用程序窗口所在的显示的选定部分创建CGImageRef快照。问题是,所有不同OS X技术使用的命名法让我真的很困惑。

我正在使用的功能是CGDisplayCreateImageForRect(CGDirectDisplayID display, CGRect rect)。文档说明CGRect rect参数是“在显示空间中指定的矩形”,用于复制到图像中的显示部分。问题是,我在控制台中获得的输出并不是我所期望的。我已经尝试了很多不同的转换,转换,协调翻转等等,我现在100%感到困惑。

所以,我想我的问题归结为:屏幕空间==设备空间==显示空间,以及如何正确转换他或她的视图框架(恰好是自定义无边框窗口)坐标(底部) -left origin)匹配显示器的坐标(左上角原点)?

如果有人能指引我,或指出我正确的方向,我会永远感激。谢谢!

1 个答案:

答案 0 :(得分:17)

Quartz使用坐标空间,其中原点(0,0)位于主显示屏的左上角。增加y会下降。

Cocoa使用一个坐标空间,其中原点(0,0)是主显示屏的左下角,并且y增加。

您可以将窗口的框架从Cocoa转换为Quartz,如下所示:

NSRect frame = window.frame;
frame.origin.y = NSMaxY(NSScreen.screens[0].frame) - NSMaxY(frame);
CGRect quartzRect = NSRectToCGRect(frame);

注意:您不使用窗口-screen,而是始终使用主屏幕。

这适用于窗口坐标中的矩形。对于视图中的矩形,首先使用-[NSView convertRect:toView:]将视图坐标转换为窗口坐标,并将nil作为表示窗口的目标视图。对于someView.bounds而言,这样做是正确的,但对于someView.frame则不行,因为视图的框架位于超视图的坐标系中。