Me gustaría saber cómo usar estas propiedades de la manera correcta.
Según tengo entendido, frame
se puede usar desde el contenedor de la vista que estoy creando. Establece la posición de la vista en relación con la vista del contenedor. También establece el tamaño de esa vista.
También center
se puede usar desde el contenedor de la vista que estoy creando. Esta propiedad cambia la posición de la vista en relación con su contenedor.
Finalmente, bounds
es relativo a la vista en sí. Cambia el área dibujable para la vista.
¿Puedes dar más información sobre la relación entre frame
y bounds
? ¿Qué pasa con el clipsToBounds
y las masksToBounds
propiedades?
Respuestas:
Como la pregunta que hice se ha visto muchas veces, proporcionaré una respuesta detallada. Siéntase libre de modificarlo si desea agregar más contenido correcto.
Primero un resumen de la pregunta: marco, límites y centro y sus relaciones.
El marco de una vista
frame
(CGRect
) es la posición de su rectángulo en elsuperview
sistema de coordenadas. Por defecto comienza en la esquina superior izquierda.Límites Una vista
bounds
(CGRect
) expresa un rectángulo de vista en su propio sistema de coordenadas.El Centro A
center
seCGPoint
expresa en términos delsuperview
sistema de coordenadas del 's y determina la posición del punto central exacto de la vista.Tomados de la posición UIView +, estas son las relaciones (no funcionan en código ya que son ecuaciones informales) entre las propiedades anteriores:
frame.origin = center - (bounds.size / 2.0)
center = frame.origin + (bounds.size / 2.0)
frame.size = bounds.size
NOTA: Estas relaciones no se aplican si las vistas se giran. Para más información, le sugiero que eche un vistazo a la siguiente imagen tomada de The Kitchen Drawer basada en el curso Stanford CS193p . Los créditos van a @Rhubarb .
El uso de le
frame
permite reposicionar y / o cambiar el tamaño de una vista dentro de ellasuperview
. Por lo general, se puede usar desdesuperview
, por ejemplo, cuando crea una subvista específica. Por ejemplo:Cuando necesita las coordenadas para dibujar dentro de un
view
, generalmente se refierebounds
. Un ejemplo típico podría ser dibujar dentro deview
una subvista como una inserción de la primera. Dibujar la subvista requiere conocer labounds
de la supervista. Por ejemplo:Se producen diferentes comportamientos cuando cambia la
bounds
vista. Por ejemplo, si cambia elbounds
size
, losframe
cambios (y viceversa). El cambio ocurre alrededorcenter
de la vista. Use el código a continuación y vea qué sucede:Además, si cambia
bounds
origin
, cambia elorigin
de su sistema de coordenadas interno. Por defecto,origin
está en(0.0, 0.0)
(esquina superior izquierda). Por ejemplo, si cambia elorigin
paraview1
, puede ver (comente el código anterior si lo desea) que ahora la esquina superior izquierdaview2
toca elview1
. La motivación es bastante simple. Usted dice aview1
que su esquina superior izquierda ahora está en la posición(20.0, 20.0)
pero ya queview2
'sframe
origin
se inicia a partir(20.0, 20.0)
, ellos coinciden.El
origin
representa laview
posición del 's dentro de susuperview
pero describe la posición delbounds
centro.Finalmente,
bounds
yorigin
no son conceptos relacionados. Ambos permiten derivar elframe
de una vista (Ver ecuaciones anteriores).Estudio de caso de View1
Esto es lo que sucede cuando se usa el siguiente fragmento.
La imagen relativa.
Esto, en cambio, es lo que sucede si cambio
[self view]
límites como el siguiente.La imagen relativa.
Aquí dices
[self view]
que su esquina superior izquierda ahora está en la posición (30.0, 20.0) pero desdeview1
el origen del cuadro comienza desde (30.0, 20.0), coincidirán.Referencias adicionales (para actualizar con otras referencias si lo desea)
Acerca de
clipsToBounds
(fuente de Apple doc)En otras palabras, si una vista
frame
es(0, 0, 100, 100)
y su subvista es(90, 90, 30, 30)
, solo verá una parte de esa subvista. Este último no excederá los límites de la vista principal.masksToBounds
es equivalente aclipsToBounds
. En lugar de aUIView
, esta propiedad se aplica a aCALayer
. Debajo del capó,clipsToBounds
llamadasmasksToBounds
. Para más referencias eche un vistazo a ¿Cómo es la relación entre los clipsToBounds de UIView y las máscarasToBounds de CALayer? .fuente
Esta pregunta ya tiene una buena respuesta, pero quiero complementarla con algunas fotos más. Mi respuesta completa está aquí.
Para ayudarme a recordar el marco , pienso en un marco en una pared . Al igual que una imagen se puede mover a cualquier parte de la pared, el sistema de coordenadas del marco de una vista es la supervista. (pared = supervista, marco = vista)
Para ayudarme a recordar los límites , pienso en los límites de una cancha de baloncesto . La pelota de baloncesto está en algún lugar dentro de la cancha, al igual que el sistema de coordenadas de los límites de la vista está dentro de la vista misma. (cancha = vista, baloncesto / jugadores = contenido dentro de la vista)
Al igual que el marco, view.center también está en las coordenadas de la supervista.
Frame vs Bounds - Ejemplo 1
El rectángulo amarillo representa el marco de la vista. El rectángulo verde representa los límites de la vista. El punto rojo en ambas imágenes representa el origen del marco o límites dentro de sus sistemas de coordenadas.
Ejemplo 2
Ejemplo 3
Ejemplo 4
Esto es lo mismo que en el ejemplo 2, excepto que esta vez todo el contenido de la vista se muestra como se vería si no estuviera recortado en los límites de la vista.
Ejemplo 5
Nuevamente, vea aquí mi respuesta con más detalles.
fuente
Encontré esta imagen más útil para comprender el marco, los límites, etc.
También tenga en cuenta que
frame.size != bounds.size
cuando se gira la imagen.fuente
Creo que si lo piensas desde el punto de vista
CALayer
, todo está más claro.El marco no es realmente una propiedad distinta de la vista o capa, es una propiedad virtual, calculada a partir de los límites, la posición (
UIView
centro de ') y la transformación.Entonces, básicamente, cómo los diseños de capa / vista realmente se deciden por estas tres propiedades (y anchorPoint), y cualquiera de estas tres propiedades no cambiará ninguna otra propiedad, como cambiar la transformación no cambia los límites.
fuente
Hay muy buenas respuestas con una explicación detallada de esta publicación. Solo me gustaría referirme a que hay otra explicación con representación visual para el significado de Frame, Bounds, Center, Transform, Bounds Origin en el video WWDC 2011 Comprensión de la representación UIKit a partir de las 4: 22 hasta las 20:10
fuente
Después de leer las respuestas anteriores, aquí agrego mis interpretaciones.
Supongamos que navega en línea, su navegador web es el
frame
que decide dónde y qué tan grande mostrar la página web. El desplazador del navegador es elbounds.origin
que decide qué parte de la página web se mostrará.bounds.origin
Es dificil de entender. La mejor manera de aprender es creando una aplicación de vista única, intentando modificar estos parámetros y ver cómo cambian las subvistas.fuente