10

所以我试图将 NSRect 转换为 CGRect。我使用NSRectToCGRect()了它可以很好地复制所有内容,但没有考虑 y 原点轴。

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

因此,一个NSRect (0,0,100,100)框位于屏幕的左下角,而一个CGRect (0,0,100,100)框位于屏幕的左上角。

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

fixedOriginY = screenHeight - NSRect.size.height - NSRect.origin.y

NSRect (0,0,100,100)因此实际上相当于 an CGRect (0,800,100,100)(在我的 900px 高度 MBA 上)。但是我不喜欢这样,我感觉它会破裂/出现视网膜问题或未来的并发症。

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

4

1 回答 1

6

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

通常,AppKit 使用以左下角为原点的坐标系。同样,CGContext您创建的 a 将原点放在左下方。

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

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

于 2013-06-12T05:46:25.687 回答