2013-06-12 37 views
6

所以我試圖將NSRect轉換爲CGRect。我使用了NSRectToCGRect(),它可以很好地複製所有內容,但不考慮y軸原點。NSRect vs CGRect: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)。不過我不喜歡這樣,我有一種感覺會打破/視網膜問題或未來的併發症。

有沒有人有解決方案或想法如何正確轉換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'之間的區別。它們都只是簡單的結構,它們的值僅相對於某個座標系(不論是提供還是使用矩形的代碼)具有意義。在這種情況下,AppKit的屏幕座標系統和CG的顯示空間座標系統之間的區別如[本答案](http://stackoverflow.com/a/14228817/1218876)中所述。 –

回答

6

矩形的原點位於左上角還是左下角取決於您使用矩形的座標系。它不取決於你是否使用CGRectNSRect

通常,AppKit使用以左下角爲原點的座標系。同樣,您創建的CGContext將原點放在左下角。

另一方面,Quartz Event Services和Quartz Display Services將原點放在左上方。 UIKit(在iOS上)將原點放在左上角。您可以在NSView子類(在OS X上)中覆蓋isFlipped以將其原點置於左上角。

當您將矩形從傳統(左下角原點)轉換爲翻轉(左上角原點)座標系時,您的基本數學運算是必要且恰當的。

+3

窗口框架(例如' - [NSWindow框架]')在**屏幕座標空間**中,其原點是左下角。 Quartz Display Services使用全局或本地**桌面座標空間**,其起點是相應的左上角。 – 2013-06-12 05:55:57