macos - NSRect 与 CGRect : y-axis inversion

标签 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 原点:

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/

相关文章:

javascript - 无法在Mac上使用node.js运行js文件

eclipse - OSX 10.7 Lion 上的 JDK

objective-c - 使用 Objective C 将文本字符串插入 NSTextView 中的光标位置或选择的文本

objective-c - NSOutlineView 源列表的数据

objective-c - 关于 Mac 开发的死树期刊?

c++ - 如何从我的 Mac 上的终端窗口运行 g++

xcode - 我可以在 Snow Leopard 机器上为 Lion 开发应用程序吗?

ios - 为什么会有 "potential leak"?

ios - 如何确定 MTLTextureDescriptor 的最大允许大小

iPhone 在 Quartz 绘图与预烘焙图像方面的性能差异(我猜可以简化为 Quartz 与 Quartz)