2011-10-24 20 views
6

decir si establezco view.bounds.origin a (50,50), entonces la subvista se dibuja (50,50) a la izquierda para ver. Pero pensé que debería ser el resultado inverso, entonces, ¿qué significa bounds.origin?¿Cuál es el significado de view.bounds.origin?

lo siento chicos, no soy un hablante nativo de Inglés, por lo que poner este código de ejemplo y la imagen de este tiempo ~~

subview = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)]; 
subview.backgroundColor = [UIColor blueColor]; 
subview.bounds = CGRectMake(50, 50, 200, 200); 

subsubview = [[UIView alloc] initWithFrame:CGRectMake(0, 0,100,100)]; 
subsubview.backgroundColor = [UIColor yellowColor]; 
[subview addSubView:subsubView]; 

esto hará que este resultado: enter image description here

¿por qué la la vista amarilla se encuentra allí?

+0

¿Qué quiere decir con "el resultado inverso"? – Geoffroy

+0

¿Puede aclarar, posiblemente con algún código de ejemplo, qué vista está configurando los límites.origin en y cuándo está agregando la subvista, y cuál es el marco de la subvista? – jrturton

+0

donde ha establecido los boundaries.origin? –

Respuesta

4

Desde el documentation:

En la pantalla, la grada rectángulo representa la misma porción visible de la vista como su rectángulo marco. De forma predeterminada, el origen de el rectángulo de límites está establecido en (0, 0) pero puede cambiar este valor a para mostrar diferentes partes de la vista.

Lo que has hecho alterando bounds es efectiva para traducir subView 's interno de coordenadas espacio hacia abajo y hacia la derecha en 50 puntos. A continuación, ha agregado 'subsubView' con un origen de 0,0 dentro del espacio de coordenadas subView; por lo tanto, está 50 puntos arriba ya la izquierda del origen visible de subView.

Si ha configurado subView 's frame en lugar de bounds, se habría movido subView dentro de sus espacio de coordenadas del supervista, por lo que su cuadrado azul se habría movido hacia arriba y hacia la izquierda, y el cuadrado amarillo se encuentra dentro y tiene el mismo origen

El ajuste bounds a algo que no tiene un origen de (0,0) es similar a agregar una traducción a la vista. En casi todas las circunstancias, esto no es lo que desea hacer, y debería establecer la propiedad frame en su lugar. Cada vista en una jerarquía de vista tiene su propio espacio de coordenadas. frame es donde una vista está relacionada con su supervista, y bounds es el espacio dentro de una vista.

Por lo tanto, una subvista frame describe su ubicación y tamaño en la supervisión bounds. Si el bounds de la supervista tiene un origen distinto de cero, y agrega una subvista con un frame que tiene un origen cero, estará "fuera" de los límites de la supervista.

+0

"esto es por lo tanto, 50 puntos arriba ya la izquierda del origen visible de la subvista" ¿por qué es eso, puede explicarlo un poco más? – onmyway133

+0

@entropy - editado. Espero que ayude. – jrturton

+0

1. "Si hubiera establecido el marco de subView en lugar de límites, habría movido subView dentro del espacio de coordenadas de su superview, por lo que su cuadrado azul se habría movido hacia arriba y hacia la izquierda" Creo que escribió mal aquí, cambiando el marco de subView (subView. frame.origin.x + = 50, subView.frame.origin.y + = 50) debería moverse hacia la parte inferior derecha. Además, no puedo imaginar cómo son los límites cuando su origen cambia – onmyway133

1

El marco de su vista azul sigue siendo 100, 100, 200, 200. Los límites son 50, 50, 200, 200, pero el marco no ha cambiado.

La vista amarilla se agrega a la vista azul, en 0, 0, dentro de los límites, no en el marco. Entonces el amarillo se muestra a 50, 50, 50, 50.

Cambio:

subview.bounds = CGRectMake(50, 50, 200, 200);

Para:

subview.bounds = CGRectMake(100, 100, 200, 200);

y ver qué pasa.

+0

¿cómo se ven los límites cuando se modifica el origen de sus límites? No me puedo imaginar eso – onmyway133

0

En la pantalla, el rectángulo de límites representa la misma parte visible de la vista como su rectángulo rectángulo. De forma predeterminada, el origen de el rectángulo de límites está establecido en (0, 0) pero puede cambiar este valor a para mostrar diferentes partes de la vista. El tamaño del rectángulo de límites está acoplado al tamaño del rectángulo del cuadro, de forma que cambia a uno afecta al otro. El cambio del tamaño de los límites aumenta o reduce la vista relativa a su punto central. Las coordenadas del rectángulo de límites siempre se especifican en puntos.

De UIView's documentation.

Estudiar View Programming guide también será útil.

2

El problema es que generalmente pensamos que al cambiar el origen de los límites blue view (por ejemplo, desplazar hacia la parte inferior derecha), la vista amarilla también debe desplazarse hacia abajo, ya que la posición yellow view es relativa a su sistema de coordenadas de superview (en este caso el origen de los límites blue view). Este no es el caso

En su lugar, deberíamos pensar que el blue view define una máscara en la que solo muestra una parte del rectángulo en su espacio de coordenadas. Entonces, si cambiamos el origen de los límites blue view a la parte inferior derecha, simplemente cambia la máscara a la parte inferior derecha, y solo se muestran las vistas dentro de esa máscara. Y al red view, siempre muestra que la máscara en una posición fija (blue view el origen del marco no cambia). Piense en la red view teniendo la máscara blue view y poner en la posición definida por el marco blue view

Sólo encontraron esta Understanding UIScrollView por Ole que es muy útil y explica muy claramente

os recomiendo la lectura de este

Una vista proporciona una ventana en el plano definido por su sistema de coordenadas . El rectángulo de límites de vista describe la posición y el tamaño de el área visible.

Parece que la vista se ha movido hacia abajo en 100 puntos, y esto es de hecho cierto en relación con su propio sistema de coordenadas.El view's posición real en la pantalla (o en su supervista, para decirlo más precisión) permanece fija, sin embargo, como que está determinada por su marco, que no ha cambiado

enter image description here

0

UIWindow: frame == bounds :: ==> (0, 0, windowWidth, windowHeight)

subvista: frame :: ==> (100, 100, 200, 200) en los límites de UIWindows [UIWindows cordinate space.]

Cuando yo u hacer esto:

subview.bounds = CGRectMake(50, 50, 200, 200); 

que está diciendo el marco de subvista que subvista se iniciará con (50,50, 200, 200) si subvista de que subvista [subsubview] eran para cubrir la subvista correctamente.

Del mismo modo que tendría que especificar el marco de su subvista en (0,0, windowWidth, windowHeight) para cubrir la ventana correctamente con su subvista.

El punto es que un cuadro de SUBVIEWS depende de su sistema cordinates SUPERVIEWS inmediato. El sistema cordinate local/interno de la supervista inmediata es su límite.

Llegando al punto, ¿por qué la subversión sube y se deja 50 50 puntos?

subview.bounds = CGRectMake(50, 50, 200, 200); 

subsubview = [[UIView alloc] initWithFrame:CGRectMake(0, 0,100,100)]; 

Comparar entre (0,0) y (50,50).
Dijimos que el espacio cordinate local/interno de la subvista debe ser (50,50, 200, 200) Luego agregamos la subvista de subvista [subsubview] a (0,0) dentro de una vista subvista que comienza en (50,50)

En este caso, (0,0) está arriba a la izquierda de (50,50). Es por eso que esto sucedió.

Si aún no entiendes lo que significa, echa un vistazo profundo y dibuja algunos rectángulos en el cuaderno lentamente. Es difícil hacerlo bien de primera mano.

Cuestiones relacionadas