Marco de UIView, límites, centro, origen, ¿cuándo usar qué?

195

UIViewtiene las propiedades frame, bounds, center, y origin, y todos ellos parecen estar relacionados entre sí. La mayoría de las veces, trato framecuando establezco la posición y el tamaño de a UIView. Entiendo que frameestá usando un sistema de coordenadas global y boundsestá usando coordenadas de la vista local (por lo tanto, sus x e y son 0, pero no siempre), pero aún me resulta confuso cuándo usar qué.

¿En qué contexto (y lo que es el momento adecuado) las otras propiedades ( bounds, center, origin) se debe utilizar?

Bendición
fuente
El siguiente enlace tiene la mejor respuesta. stackoverflow.com/questions/5361369/…
Ohmy
Frame vs Bounds con imágenes: stackoverflow.com/a/28917673/3681880
Suragch

Respuestas:

240

La respuesta de Marco anterior es correcta, pero solo para ampliar la cuestión de "bajo qué contexto" ...

frame : esta es la propiedad que usa con más frecuencia para las aplicaciones normales de iPhone. la mayoría de los controles se colocarán en relación con el control "que contiene", de modo que frame.origin corresponderá directamente con el lugar donde el control debe mostrarse, y frame.size determinará qué tan grande es el control.

centro : esta es la propiedad en la que probablemente se centrará para los juegos y animaciones basados ​​en sprites en los que puede ocurrir movimiento o escala. Por defecto, la animación y la rotación se basarán en el centro de la UIView. Rara vez tiene sentido intentar administrar dichos objetos por la propiedad del marco.

límites : esta propiedad no es una propiedad de posicionamiento, pero define el área dibujable de la UIView "relativa" al marco. Por defecto, esta propiedad suele ser (0, 0, ancho , alto ). Cambiar esta propiedad le permitirá dibujar fuera del marco o restringir el dibujo a un área más pequeña dentro del marco. Una buena discusión de esto se puede encontrar en el siguiente enlace. Es poco común que se manipule esta propiedad a menos que haya una necesidad específica de ajustar la región de dibujo. La única excepción es que la mayoría de los programas utilizarán el [[UIScreen mainScreen] bounds]inicio para determinar el área visible para la aplicación y configurar su marco inicial de UIView en consecuencia.

¿Por qué hay un rectángulo de marco y un rectángulo de límites en una UIView?

Esperemos que esto ayude a aclarar las circunstancias en las que cada propiedad podría usarse.

Barney Mattox
fuente
33
Creo que vale la pena agregar que boundsse usan comúnmente cuando una vista tiene una transformación aplicada. En estas circunstancias, la framepropiedad no está definida. Como se señaló en otras respuestas, modificar centery boundsson equivalentes a modificar la posición y el tamaño de la vista, respectivamente.
Stuart
36

Son valores relacionados y se mantienen consistentes mediante los métodos de establecimiento / obtención de propiedades (y utilizando el hecho de que el marco es un valor puramente sintetizado, no respaldado por una variable de instancia real).

Las ecuaciones principales son:

frame.origin = center - bounds.size / 2

(que es lo mismo que)

center = frame.origin + bounds.size / 2

(y también hay)

frame.size = bounds.size

Eso no es código, solo ecuaciones para expresar la invariante entre las tres propiedades. Estas ecuaciones también suponen que la transformación de su vista es la identidad, que es por defecto. Si no es así, entonces los límites y el centro mantienen el mismo significado, pero el marco puede cambiar. A menos que esté haciendo rotaciones sin ángulo recto, el marco siempre será la vista transformada en términos de coordenadas de la supervista.

Todo esto se explica con más detalle con una útil mini biblioteca aquí:

http://bynomial.com/blog/?p=24

Tyler
fuente
18

Las propiedades center, boundsy frameestán entrelazados: el cambio de una actualizará los otros, por lo que usarlos como quiera. Por ejemplo, en lugar de modificar los parámetros x / y de framepara volver a centrar una vista, simplemente actualice la centerpropiedad.

Marco Mustapic
fuente