2012-08-26 19 views
11

Esta pregunta no es un "cómo hago yo" sino un "por qué es esto" con respecto a algunas propiedades de Clase en Objective-C.¿Por qué "expresión no asignable" (UIView.frame.origin)?

entiendo que los dos ejemplos siguientes no están permitidas y dan como resultado un error ("expresión no asignable"):

self.myUIView.frame.origin.x = 50; 
self.myUIView.frame.origin = CGPointMake(50,50); 

y que la forma correcta de hacer esto es crear un nuevo CGRect, establecer los valores deseados y luego asignarlo:

CGRect rect = self.myUIView.frame; 
rect.origin = CGPointMake(50, 50); 
self.myUIView.frame = rect; 

Me gustaría entender por qué es esto.

CGRect es una estructura que contiene dos estructuras. ¿La restricción tiene que ver con cómo se asignan las estructuras, para evitar una asignación que podría desbordar esa memoria? ¿O es más una convención sobre propiedades públicas y privadas?

Me doy cuenta de que esto parece una pregunta menor/básica, pero creo que es importante aclarar entendimientos turbios/malos de estos tipos fundamentales de cosas.

Respuesta

9

Es porque si pudiera cambiar directamente el origen o el tamaño de un marco, omitiría el método setter de la propiedad de marco de UIView. Esto sería malo por múltiples razones.

UIView no tendría ninguna posibilidad de recibir notificaciones sobre cambios en el marco. Pero debe conocer estos cambios para poder actualizar sus subvistas o rediseñarlas.

Además, para que KVO funcione, debe usar los ajustadores correctos (ya sea mediante el uso de setFrame: o la notación de puntos).

5

El problema con la asignación de elementos del struct es que la clase que posee el struct no tendrá idea de que el struct ha sido cambiado. Esto no es bueno cuando se habla, por ejemplo, del origen de un fotograma: se espera que UIView se mueva en respuesta a un cambio de origen, pero dado que no se notificaría el cambio a la clase, no se produciría movimiento.

Configuración de frame, por otro lado, se puede detectar, porque se invocó el método UIViewsetFrame. Este es el código en el que UIView podría ocuparse de redimensionar, reposicionar, etc.

Cuestiones relacionadas