2012-02-23 17 views
13

Puede sonar muy tonto para las personas que saben esto, pero soy bastante nuevo en iOS. Quería saber, ¿por qué no podemos modificar el origen o el tamaño o puede ser el ancho x, y o alto de estas propiedades de un marco UIView?¿Por qué no podemos cambiar directamente el tamaño o el origen de un marco UIView?

marco es una estructura CGRect y el origen y el tamaño son nuevamente estructuras CGPoint y CGSize. cuando podemos acceder a ellos, ¿por qué no podemos modificarlos?

No hay nada como esto en un CGRect, podemos modificar sus atributos, entonces ¿por qué no podemos hacerlo para el marco o los límites?

+0

¡Gran pregunta, no tonto en absoluto! –

+1

@ChrisNolet: ¡Han pasado más de dos años desde que publiqué esto! –

+2

Después de 4 años de hacer iOS, ¡finalmente entiendo por qué no puedo establecer el marco directamente! –

Respuesta

19

supongo que te refieres por qué no se puede hacer algo como esto:

myView.frame.origin.x = 23.0; 

Es una buena pregunta, nada tonto al respecto. El problema es que el marco se sostiene como la propiedad de la vista, no los componentes individuales del marco (el tamaño y el origen, o incluso más profundo, el ancho, la longitud, xey).

El marco es fundamental para la vista, por lo que hay muchas acciones que una vista debe hacer si se modifica su marco. Si llegaras a modificar el origen.x directamente, estarías evitando el método setFrame, donde probablemente todo esto ocurra.

Al acceder a view.frame se les está dando un CGRect que tiene el mismo valor que view.frame, pero no es en realidad el marco, por lo que cualquier modificación que no afectan a la vista.

Puede hacerlo en pasos:

CGRect frame = view.frame; 
frame.origin.x = 23.0; 
view.frame = frame; 
+0

Gracias por la respuesta y no lo considera tonto. Pero me siento tonto después de entenderlo. Espero que cualquier persona que tenga una duda similar lo encuentre útil. –

+1

Lo siento, todavía no lo entiendo. OK, por 'view.frame' obtenemos una estructura C que no es el' view.frame' real. ¿No es más simple decir que obtenemos una copia? OK, entonces obtenemos una copia. ¿Por qué necesita una copia de todos modos? – Philip007

+0

no responde nada sobre por qué la actualización de origen/tamaño no puede actualizar el marco? –

8

La respuesta está en la sintaxis del lenguaje (un poco ofuscado):

  1. myView es un objeto de Objective-C.
  2. Por lo tanto, myView.frame es un método de acceso a la propiedad que se envía.
  3. Devuelve una estructura C de tipo CGRect.
  4. frame.origin.x = 1 modifica la estructura temporal devuelta que es local para su código.

Su intención era decirle algo a un objeto enviándole un mensaje. Pero, en su lugar, le solicitó al objeto los datos y luego los modificó. El objeto nunca lo haría ahora.

El compilador debe advertirle acerca de este error.

+0

Gracias por una respuesta limpia y simplificada. –

Cuestiones relacionadas