2013-06-12 6 views
6

私はNSRectをCGRectに変換しようとしています。私はNSRectToCGRect()を使用して細かくすべてをコピーしますが、y軸を考慮しません。NSRect対CGRect:y軸反転

問題:左上に(0,0)のCGRect起点があります。 NSRectの起点(0,0)は左下です。

したがって、CGRect (0,0,100,100)ボックスは画面の左上に配置され、NSRect (0,0,100,100)ボックスは画面の左下に配置されます。

私は基本的な数学を通じてY-起源を修正するハックを持っている:

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

したがってNSRect (0,0,100,100)の同等は(私900px高さMBAに)実際にCGRect (0,800,100,100)です。しかし、私はこれが好きではありません、私はそれが網膜または将来の合併症で問題を壊す/持っているという気持ちがあります。

誰でも、NSRectをCGRectに正しく変換する方法についての解答がありますか?

+0

CoreGraphicsは左上に原点を持っていると思いますか?間接的な参照のみがすぐに見つかりますが、http://developer.apple.com/library/ios/#documentation/2DDrawing/Conceptual/DrawingPrintingiOS/GraphicsDrawingOverview/GraphicsDrawingOverview.html - テキストの検索「使用されているデフォルトの座標系Core GraphicsフレームワークはLLOベースです。 (LLO =左下原点) – Tommy

+0

NSWindowフレームプロパティはNSRectなので、0,0(左下の画面)に配置します。そのフレームをCGRectに変換し、CGDisplayCreateImageForRect([0]、windowCGRectを表示)を使ってスクリーンショットを撮ります。スクリーンショットは画面の左上にあります。 – user339946

+1

'CGRect'と' NSRect'の違いとは考えません。それらは単純な構造体の両方であり、その値はある種の座標系(矩形を提供したり消費したコードのどちらか)に対してのみ意味を持ちます。この場合、[この回答](http://stackoverflow.com/a/14228817/1218876)で説明されているように、AppKitの画面座標系とCGの表示空間座標系の違いになります。 –

答えて

6

矩形の原点が左上か左下かは、矩形を使用する座標系によって異なります。 CGRectNSRectのどちらを使用するかによって異なります。

通常、AppKitは、左下隅を原点とする座標系を使用します。同様に、作成するCGContextは、原点を左下に置きます。

一方、Quartz Event ServicesとQuartz Display Servicesは、原点を左上に置きます。 UIKit(iOS上)は、原点を左上に置きます。 NSViewサブクラス(OS X上)のisFlippedをオーバーライドして、その原点を左上に置くことができます。

矩形を従来の(左下原点)から反転(左上原点)座標系に変換する場合は、基本的な計算が必要です。

+3

ウィンドウ枠(例: ' - [NSWindow frame]')は**画面座標空間**にあり、その原点は左下隅です。 Quartz Display Servicesは、グローバルまたはローカル**のデスクトップ座標空間**を使用しますが、その起点は対応する左上隅です。 –

関連する問題