2010-01-27 9 views

Respuesta

19

Son lo mismo. This link tiene más información. Copiado aquí por referencia rápida:

CGRect es el equivalente de CoreGraphics NSRect.

Están hechas deliberadamente para tener el mismo diseño en la memoria. Como tal, se le permite convertir un NSRect a un CGRect al hacer esto:

CGRect cgrect = *(CGRect *)&nsrect; 

CoreGraphics también proporciona una función CGRectMake() la que funciona igual que NSMakeRect() (tenga en cuenta la inversión del verbo y objeto en los nombres), excepto que devuelve un CGRect.

+7

Bueno, eso está permitido, excepto que rompe las reglas de aliasing estrictas en el compilador. Arreglaré esa página wiki. Use NSRectFromCGRect y NSRectToCGRect para convertir. – Ken

+4

En 64 bits, o cuando compila con 'NS_BUILD_32_LIKE_64',' NSRect' se define como 'CGRect', por lo que ni siquiera necesita saltar por el aro del puntero. –

+0

no hace 'CGRect cgrect = (CGRect) nsrect;' ¿hace lo mismo? – Alexander

4

En particular, me pregunto acerca de la posición del origen.

Eso depende de dónde hayas llegado y dónde lo estés usando. En general, Core Graphics y UIKit usan coordenadas volteadas (origen superior izquierdo, positivo y decreciente), mientras que AppKit usa coordenadas no desplegadas (origen inferior izquierdo, positivo y ascendente). Pero es posible voltear o desajustar las coordenadas de cada API, y algunas clases, como NSImage y NSView, hacen que sea muy fácil hacerlo.

+0

Cuando leí su pregunta, primero pensé que tal vez estaba refiriéndose al diseño de la memoria; es decir, si el desplazamiento ("posición", en su idioma) del miembro '.origin' (y por lo tanto,' .size' también, por supuesto) es el mismo en ambas estructuras. Como alguien señaló anteriormente, sin embargo, se garantiza que los dos tienen el mismo diseño de memoria. –

Cuestiones relacionadas