NSRect与CGRect:y轴反转

use*_*946 8 macos cocoa core-graphics

所以我试图将NSRect转换为CGRect.我使用的NSRectToCGRect()是精确复制所有内容,但没有考虑y原点轴.

问题:(0,0)的CGRect原点是左上角.NSRect原点(0,0)位于左下角.

因此,一个NSRect (0,0,100,100)盒子位于屏幕的左下方,而一个CGRect (0,0,100,100)盒子位于屏幕的左上角.

我有一个通过基本数学修复y-origin的hack:

fixedOriginY = screenHeight - NSRect.size.height - NSRect.origin.y
Run Code Online (Sandbox Code Playgroud)

因此,相当于一个NSRect (0,0,100,100)实际上CGRect (0,800,100,100)(在我的900px高度MBA).但是我不喜欢这个,我觉得它会破坏视网膜或未来并发症的问题.

有没有人有关于如何正确地将NSRect转换为CGRect的解决方案或想法?

rob*_*off 6

矩形的原点是左上角还是左下角取决于使用矩形的坐标系.它不取决于你是否使用CGRectNSRect.

通常,AppKit使用左下角为原点的坐标系.同样,CGContext您创建的一个将原点放在左下角.

另一方面,Quartz Event Services和Quartz Display Services将原点放在左上角.UIKit(在iOS上)将原点放在左上角.您可以isFlippedNSView子类中重写(在OS X上)以将其原点放在左上角.

当您将矩形从传统(左下原点)转换为翻转(左上原点)坐标系时,您的基本数学是必要且正确的.

  • 窗框(例如` - [NSWindow frame]`)位于**屏幕坐标空间**中,其原点是左下角.Quartz Display Services使用全局或本地**桌面坐标空间**,其起源是相应的左上角. (3认同)