2010-01-27 18 views

Antwort

19

Sie sind gleich. This link hat weitere Informationen. Kopierte hier zum schnellen Nachschlagen:

CGRect ist die Core Graphics äquivalent NSRect.

Sie sind absichtlich so gemacht, dass sie das gleiche Layout im Speicher haben.

CGRect cgrect = *(CGRect *)&nsrect; 

Core Graphics bietet auch eine CGRectMake() Funktion, die funktioniert genauso wie NSMakeRect() (man beachte die Umkehrung von Verb und Objekt in dem Namen), außer es: Als solches ist es ein NSRect zu einem CGRect, indem Sie diese konvertieren erlaubt gibt eine CGRect zurück.

+7

Nun, das ist erlaubt, außer dass es strenge Aliasing-Regeln im Compiler bricht. Ich werde diese Wiki-Seite reparieren. Verwenden Sie NSRectFromCGRect und NSRectToCGRect zum Konvertieren. – Ken

+4

In 64-Bit, oder wenn Sie mit 'NS_BUILD_32_LIKE_64' kompilieren, wird' NSRect' als 'CGRect' definiert, so dass Sie nicht einmal durch den Zeiger-Rahmen springen müssen. –

+0

nicht 'CGRect cgrect = (CGRect) nsrect;' das gleiche tun? – Alexander

4

Insbesondere frage ich mich über die Position des Ursprungs.

Das hängt davon ab, wo Sie das Rect haben und wo Sie es verwenden. Im Allgemeinen verwenden Core Graphics und UIKit gespiegelte Koordinaten (Ursprung oben links, positives y geht nach unten), während AppKit nicht gespaltene Koordinaten verwendet (Ursprung links unten, positives y steigt). Es ist jedoch möglich, Koordinaten von jeder API zu spiegeln oder zu entfernen, und einige Klassen, wie NSImage und NSView, machen dies sehr einfach.

+0

Als ich seine Frage las, dachte ich zuerst, dass er vielleicht auf das Speicherlayout Bezug nahm; h., ob der Versatz ("Position" in seiner Sprache) des ".origin" -Mitglieds (und daher natürlich auch ".size") auf beiden Strukturen gleich ist. Wie oben angedeutet, haben die beiden jedoch garantiert das gleiche Speicherlayout. –

Verwandte Themen