所以我试图将 NSRect 转换为 CGRect。我使用了 NSRectToCGRect()
,它可以很好地复制所有内容,但不考虑 y 原点轴。
问题:(0,0) 的 CGRect 原点是左上角。 NSRect 原点 (0,0) 位于左下角。
因此,NSRect (0,0,100,100)
框位于屏幕左下角,而 CGRect (0,0,100,100)
框位于屏幕顶部屏幕左侧。
我有一个技巧,可以通过基本数学来修复 y 原点:
fixedOriginY = screenHeight - NSRect.size.height - NSRect.origin.y
因此,NSRect (0,0,100,100)
的等价物实际上是 CGRect (0,800,100,100)
(在我的 900px 高度 MBA 上)。然而我不喜欢这个,我有一种感觉它会破裂/视网膜出现问题或 future 出现并发症。
有人有关于如何正确将 NSRect 转换为 CGRect 的解决方案或想法吗?
最佳答案
矩形的原点是在左上角还是左下角取决于您使用矩形的坐标系。它并不取决于您使用的是CGRect
还是NSRect
。
通常,AppKit 使用以左下角为原点的坐标系。同样,您创建的 CGContext 会将原点放在左下角。
另一方面,Quartz 事件服务和 Quartz 显示服务将原点放在左上角。 UIKit(在 iOS 上)将原点放在左上角。您可以在 NSView
子类(在 OS X 上)中重写 isFlipped
,以将其原点置于左上角。
当您将矩形从传统(左下原点)转换为翻转(左上原点)坐标系时,您的基本数学是必要且正确的。
关于macos - NSRect 与 CGRect : y-axis inversion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17057757/