Me gustaría saber cómo usar estas propiedades de la manera correcta.
Según tengo entendido, framese 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 centerse 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, boundses relativo a la vista en sí. Cambia el área dibujable para la vista.
¿Puedes dar más información sobre la relación entre framey bounds? ¿Qué pasa con el clipsToBoundsy las masksToBoundspropiedades?

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 elsuperviewsistema 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
centerseCGPointexpresa en términos delsuperviewsistema 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.sizeNOTA: 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
framepermite 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 deviewuna subvista como una inserción de la primera. Dibujar la subvista requiere conocer laboundsde la supervista. Por ejemplo:Se producen diferentes comportamientos cuando cambia la
boundsvista. Por ejemplo, si cambia elboundssize, losframecambios (y viceversa). El cambio ocurre alrededorcenterde la vista. Use el código a continuación y vea qué sucede:Además, si cambia
boundsorigin, cambia eloriginde su sistema de coordenadas interno. Por defecto,originestá en(0.0, 0.0)(esquina superior izquierda). Por ejemplo, si cambia eloriginparaview1, puede ver (comente el código anterior si lo desea) que ahora la esquina superior izquierdaview2toca elview1. La motivación es bastante simple. Usted dice aview1que su esquina superior izquierda ahora está en la posición(20.0, 20.0)pero ya queview2'sframeoriginse inicia a partir(20.0, 20.0), ellos coinciden.El
originrepresenta laviewposición del 's dentro de susuperviewpero describe la posición delboundscentro.Finalmente,
boundsyoriginno son conceptos relacionados. Ambos permiten derivar elframede 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 desdeview1el 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
framees(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.masksToBoundses equivalente aclipsToBounds. En lugar de aUIView, esta propiedad se aplica a aCALayer. Debajo del capó,clipsToBoundsllamadasmasksToBounds. 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.sizecuando 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 (
UIViewcentro 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
frameque decide dónde y qué tan grande mostrar la página web. El desplazador del navegador es elbounds.originque decide qué parte de la página web se mostrará.bounds.originEs 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