2013-06-12 4 views
6

Also ich versuche, ein NSRect zu einem CGRect zu konvertieren. Ich benutzte NSRectToCGRect(), die alles über fein kopiert, aber y-Ursprungsachse nicht berücksichtigt.NSRect vs CGRect: y-Achse Inversion

Das Problem: Ein CGRect-Ursprung von (0,0) ist oben links. NSRect Herkunft (0,0) ist unten links.

So befindet sich eine NSRect (0,0,100,100) Box unten links auf Ihrem Bildschirm, während eine CGRect (0,0,100,100) Box oben links auf Ihrem Bildschirm platziert ist.

Ich habe einen Hack, der den y-Ursprung durch grundlegende mathematische behebt:

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

So die äquivalent ein NSRect (0,0,100,100) ist eigentlich CGRect (0,800,100,100) (auf meiner 900px Höhe MBA). Aber ich mag das nicht, ich habe das Gefühl, dass es Probleme mit Netzhaut oder zukünftigen Komplikationen haben wird.

Hat jemand eine Lösung oder eine Idee, wie man NSRect korrekt in CGRect konvertiert?

+0

Woran denken Sie, dass CoreGraphics den Ursprung oben links hat? Ich kann nur indirekten Verweis auf es sofort finden, aber siehe http://developer.apple.com/library/ios/#documentation/2DDrawing/Conceptual/DrawingPrintingiOS/GraphicsDrawingOverview/GraphicsDrawingOverview.html - Suche nach dem Text "Das Standard-Koordinatensystem verwendet von Core Graphics Framework ist LLO-basiert. " (LLO = unterer linker Ursprung) – Tommy

+0

Die NSWindow-Rahmeneigenschaft ist ein NSRect, also platziere ich sie bei 0,0 (unten links). Ich konvertiere diesen Frame in CGRect, mache einen Screenshot mit CGDisplayCreateImageForRect (zeigt [0], windowCGRect) an. Der Screenshot befindet sich oben links auf dem Bildschirm. – user339946

+1

Denke nicht, dass es ein Unterschied zwischen 'CGRect' und' NSRect' ist. Sie sind beide nur einfache Strukturen, und ihre Werte haben nur eine Bedeutung relativ zu einem Koordinatensystem (entweder das des Codes, der das Rechteck lieferte oder verbraucht). In diesem Fall besteht der Unterschied zwischen dem Bildschirmkoordinatensystem von AppKit und dem Koordinatensystem des Koordinatensystems von CG, wie in [diese Antwort] beschrieben (http://stackoverflow.com/a/14228817/1218876). –

Antwort

6

Ob der Ursprung eines Rechtecks ​​oben links oder unten links liegt, hängt vom Koordinatensystem ab, in dem Sie das Rechteck verwenden. Es kommt nicht darauf an, ob Sie CGRect oder NSRect verwenden.

In der Regel verwendet AppKit Koordinatensysteme, bei denen die linke untere Ecke der Ursprung ist. In ähnlicher Weise wird durch einen CGContext, den Sie erstellen, der Ursprung unten links eingefügt.

Auf der anderen Seite legen Quartz Event Services und Quartz Display Services den Ursprung oben links. UIKit (auf iOS) setzt den Ursprung oben links. Sie können isFlipped in einer NSView Unterklasse (unter OS X) überschreiben, um den Ursprung oben links zu setzen.

Ihre grundlegende Mathematik ist notwendig und richtig, wenn Sie ein Rechteck von einem traditionellen (links unten) zum umgedrehten (oben links) Koordinatensystem konvertieren.

+3

Fensterrahmen (z. B. '- [NSWindow frame]') befinden sich im ** Bildschirmkoordinatenraum **, dessen Ursprung die untere linke Ecke ist. Quartz Display Services verwendet entweder globale oder lokale ** Desktop-Koordinatenräume **, deren Ursprung die entsprechenden oberen linken Ecken sind. –

Verwandte Themen