UIView
y todas sus subclases tienen las propiedades frame
y bounds
. ¿Cual es la diferencia?
cocoa
cocoa-touch
uiview
mk12
fuente
fuente
Respuestas:
Los límites de una UIView es el rectángulo , expresado como una ubicación (x, y) y un tamaño (ancho, alto) relativo a su propio sistema de coordenadas (0,0).
El marco de una UIView es el rectángulo , expresado como una ubicación (x, y) y un tamaño (ancho, alto) relativo a la supervista que contiene.
Entonces, imagine una vista que tiene un tamaño de 100x100 (ancho x alto) posicionada en 25,25 (x, y) de su supervista. El siguiente código imprime los límites y el marco de esta vista:
Y la salida de este código es:
Por lo tanto, podemos ver que en ambos casos, el ancho y el alto de la vista son los mismos, independientemente de si estamos mirando los límites o el marco. Lo que es diferente es el posicionamiento x, y de la vista. En el caso de los límites, las coordenadas xey están en 0,0 ya que estas coordenadas son relativas a la vista en sí. Sin embargo, las coordenadas del marco x e y son relativas a la posición de la vista dentro de la vista principal (que anteriormente dijimos que estaba en 25,25).
También hay una gran presentación que cubre UIViews. Vea las diapositivas 1-20 que no solo explican la diferencia entre marcos y límites, sino que también muestran ejemplos visuales.
fuente
Respuesta corta
marco = ubicación y tamaño de una vista utilizando el sistema de coordenadas de la vista principal
límites = ubicación y tamaño de una vista usando su propio sistema de coordenadas
Respuesta detallada
Para ayudarme a recordar el marco , pienso en un marco en una pared . El marco de la imagen es como el borde de una vista. Puedo colgar la foto en cualquier lugar que quiera en la pared. Del mismo modo, puedo poner una vista en cualquier lugar que desee dentro de una vista principal (también llamada supervista). La vista principal es como el muro. El origen del sistema de coordenadas en iOS es la esquina superior izquierda. Podemos poner nuestra vista en el origen de la supervista configurando las coordenadas xy del marco de vista en (0, 0), que es como colgar nuestra imagen en la esquina superior izquierda de la pared. Para moverlo hacia la derecha, aumente x, para moverlo hacia abajo aumente y.
Para ayudarme a recordar los límites , pienso en una cancha de baloncesto donde a veces el baloncesto queda fuera de límites . Estás botando la pelota por toda la cancha de baloncesto, pero realmente no te importa dónde está la cancha. Podría ser en un gimnasio, o afuera en una escuela secundaria, o en frente de su casa. No importa. Solo quieres jugar baloncesto. Del mismo modo, el sistema de coordenadas para los límites de una vista solo se preocupa por la vista misma. No sabe nada acerca de dónde se encuentra la vista en la vista principal. El origen de los límites (punto (0, 0) por defecto) es la esquina superior izquierda de la vista. Cualquier subvista que tenga esta vista se presenta en relación con este punto. Es como llevar el baloncesto a la esquina delantera izquierda de la cancha.
Ahora la confusión surge cuando intentas comparar marcos y límites. Sin embargo, en realidad no es tan malo como parece al principio. Usemos algunas imágenes para ayudarnos a entender.
Frame vs Bounds
En la primera imagen a la izquierda tenemos una vista que se encuentra en la parte superior izquierda de su vista principal. El rectángulo amarillo representa el marco de la vista. A la derecha vemos la vista nuevamente, pero esta vez la vista principal no se muestra. Esto se debe a que los límites no conocen la vista principal. El rectángulo verde representa los límites de la vista. El punto rojo en ambas imágenes representa el origen del marco o los límites.
Entonces, el marco y los límites eran exactamente los mismos en esa imagen. Veamos un ejemplo en el que son diferentes.
Entonces puede ver que al cambiar las coordenadas xy del marco se mueve en la vista principal. Pero el contenido de la vista en sí todavía se ve exactamente igual. Los límites no tienen idea de que algo es diferente.
Hasta ahora, el ancho y la altura del marco y los límites han sido exactamente los mismos. Sin embargo, eso no siempre es cierto. Mira lo que sucede si giramos la vista 20 grados en sentido horario. (La rotación se realiza mediante transformaciones. Consulte la documentación y estos ejemplos de vista y capa para obtener más información).
Puedes ver que los límites siguen siendo los mismos. ¡Todavía no saben que ha sucedido nada! Sin embargo, los valores del cuadro han cambiado.
Ahora es un poco más fácil ver la diferencia entre marco y límites, ¿no? El artículo Probablemente no comprende los marcos y límites define un marco de vista como
Es importante tener en cuenta que si transforma una vista, el marco queda indefinido. Entonces, en realidad, el marco amarillo que dibujé alrededor de los límites verdes rotados en la imagen de arriba nunca existe. Eso significa que si gira, escala o realiza alguna otra transformación, ya no debería usar los valores del marco. Sin embargo, aún puede usar los valores de límites. Los documentos de Apple advierten:
Más bien desafortunado sobre el autoresizing ... Sin embargo, hay algo que puede hacer.
Los documentos de Apple indican:
Entonces, si necesita mover una vista en el padre después de que se haya realizado una transformación, puede hacerlo cambiando las
view.center
coordenadas. Al igual queframe
,center
utiliza el sistema de coordenadas de la vista principal.Ok, eliminemos nuestra rotación y centrémonos en los límites. Hasta ahora, el origen de los límites siempre se ha mantenido en (0, 0). Sin embargo, no tiene que hacerlo. ¿Qué pasa si nuestra vista tiene una gran subvista que es demasiado grande para mostrarla de una vez? Lo haremos
UIImageView
con una imagen grande. Aquí está nuestra segunda imagen desde arriba nuevamente, pero esta vez podemos ver cómo se vería todo el contenido de la subvista de nuestra vista.Solo la esquina superior izquierda de la imagen puede caber dentro de los límites de la vista. Ahora mira lo que sucede si cambiamos las coordenadas de origen de los límites.
El marco no se ha movido en la supervista, pero el contenido dentro del marco ha cambiado porque el origen del rectángulo de límites comienza en una parte diferente de la vista. Esta es toda la idea detrás
UIScrollView
de ay sus subclases (por ejemplo, aUITableView
). Consulte Comprensión de UIScrollView para obtener más explicaciones.Cuándo usar frame y cuándo usar límites
Como
frame
relaciona la ubicación de una vista en su vista principal, la usa cuando realiza cambios externos , como cambiar su ancho o encontrar la distancia entre la vista y la parte superior de su vista principal.Use
bounds
cuando realice cambios internos , como dibujar cosas u organizar subvistas dentro de la vista. También use los límites para obtener el tamaño de la vista si ha realizado alguna transfusión en ella.Artículos para futuras investigaciones:
Documentos de Apple
Preguntas relacionadas sobre StackOverflow
Otros recursos
Practica tu mismo
Además de leer los artículos anteriores, me ayuda mucho hacer una aplicación de prueba. Es posible que desee intentar hacer algo similar. (Se me ocurrió la idea de este video curso pero desafortunadamente no es gratis).
Aquí está el código para su referencia:
fuente
bounds
contraframe
de un punto de vista.intenta ejecutar el siguiente código
La salida de este código es:
la orientación del dispositivo es vertical
la orientación del dispositivo es horizontal
obviamente, puedes ver la diferencia entre marco y límites
fuente
El marco es el rectángulo que define la UIView con respecto a su supervista .
Los límites rect es el rango de valores que definen el sistema de coordenadas de NSView.
es decir, cualquier cosa en este rectángulo se mostrará en la vista UIV.
fuente
el marco es el origen (esquina superior izquierda) y el tamaño de la vista en el sistema de coordenadas de su super vista, esto significa que traduce la vista en su super vista cambiando el origen del marco, los límites , por otro lado, son el tamaño y el origen en su propio sistema de coordenadas, por lo que, de forma predeterminada, el origen de los límites es (0,0).
la mayoría de las veces el marco y los límites son congruentes, pero si tiene una vista del marco ((140,65), (200,250)) y los límites ((0,0), (200,250)) por ejemplo y la vista estaba inclinada para que quede en su esquina inferior derecha, entonces los límites seguirán siendo ((0,0), (200,250)), pero el marco no lo es.
el marco será el rectángulo más pequeño que encapsula / rodea la vista, por lo que el marco (como en la foto) será ((140,65), (320,320)).
otra diferencia es, por ejemplo, si tiene un superView cuyos límites son ((0,0), (200,200)) y este superView tiene un subView cuyo marco es ((20,20), (100,100)) y cambió los límites de superView a ((20,20), (200,200)), entonces el marco subView seguirá siendo ((20,20), (100,100)) pero desplazado por (20,20) porque su sistema de coordenadas de supervista fue desplazado por (20, 20)
Espero que esto ayude a alguien.
fuente
subView
marco es relativo a élsuperView
. cambiar lossuperView
límites a cualquier cosa no hará que elsubView
origen coincida con élsuperView
.Enmarque su relativo a su SuperView mientras que los límites relativos a su NSView.
Ejemplo: X = 40, Y = 60. También contiene 3 vistas. Este diagrama muestra una idea clara.
fuente
Déjame agregar mis 5 centavos.
La vista principal de la vista usa el marco para colocarlo dentro de la vista principal.
La vista misma utiliza los límites para colocar su propio contenido (como lo hace una vista de desplazamiento mientras se desplaza). Ver también clipsToBounds . Los límites también se pueden usar para acercar / alejar el contenido de la vista.
Analogía:
Marco ~
Límites de pantalla de TV ~ Cámara (zoom, mover, rotar)
fuente
Las respuestas anteriores han explicado muy bien la diferencia entre límites y marcos.
Entonces existe la confusión de que en el caso de Bounds, X, Y siempre será "0". Esto no es verdad . Esto también se puede entender en UIScrollView y UICollectionView.
Cuando los límites 'x, y no son 0.
Supongamos que tenemos un UIScrollView. Hemos implementado la paginación. El UIScrollView tiene 3 páginas y el ancho de su ContentSize es tres veces el ancho de la pantalla (suponga que ScreenWidth es 320). La altura es constante (suponga 200).
Agregue tres UIImageViews como subViews y observe de cerca el valor x del cuadro
Página 0: cuando el ScrollView está en la página 0, los límites serán (x: 0, y: 0, ancho: 320, altura: 200)
Página 1: Desplácese y muévase a la Página 1.
Ahora los límites serán (x: 320, y: 0, ancho: 320, altura: 200) Recuerde que dijimos con respecto a su propio Sistema de coordenadas. Así que ahora la "Parte visible" de nuestro ScrollView tiene su "x" en 320. Mire el marco de imageView1.
Lo mismo para el caso de UICollectionView. La forma más fácil de ver collectionView es desplazarlo e imprimir / registrar sus límites y obtendrá la idea.
fuente
Todas las respuestas anteriores son correctas y esta es mi opinión sobre esto:
Para diferenciar entre el marco y los límites, el desarrollador de CONCEPTOS debe leer:
"límites" es confuso porque da la impresión de que las coordenadas son la posición de la vista para la que se establece. Pero estos están en relaciones y ajustados de acuerdo con las constantes de trama.
fuente
Una ilustración más para mostrar la diferencia entre marco y límites. En este ejemplo:
View B
es una subvista deView A
View B
fue trasladado ax:60, y: 20
View B
fue girado45 degrees
fuente
Marco vs atado
fuente
marco = ubicación y tamaño de una vista utilizando el sistema de coordenadas de la vista principal
límites = ubicación y tamaño de una vista usando su propio sistema de coordenadas
Una vista rastrea su tamaño y ubicación utilizando dos rectángulos: un rectángulo de marco y un rectángulo de límites. El rectángulo del marco define la ubicación y el tamaño de la vista en la supervista utilizando el sistema de coordenadas de la supervista. El rectángulo de límites define el sistema de coordenadas interiores que se utiliza al dibujar el contenido de la vista, incluido el origen y la escala. La Figura 2-1 muestra la relación entre el rectángulo del marco, a la izquierda, y el rectángulo de límites, a la derecha ".
En resumen, el marco es la idea de una vista de la supervista, y los límites son la propia idea de la vista. Tener múltiples sistemas de coordenadas, uno para cada vista, es parte de la jerarquía de vistas.
fuente