2011-12-09 15 views
29

¿Cuándo no sería bounds.origin de un UIView (0, 0)?¿Cuándo un bounds.origin de UIView no será (0, 0)?

This post fue útil para mí:

IMPORTANTE !! Los límites X e Y, el origen, son para moverse dentro de la vista . Para eample X + 5, mover 5pix a la izquierda del origen del marco significa dibujar todo el contenido dentro de esta Vista a la izquierda 5pix del origen del marco. No se hace nada a sí mismo, es lo que se dibuja en él que se ve afectado.

Pero solo describe el caso cuando establecí el valor de bounds.origin.
¿En qué otros casos el valor de bounds.origin != (0, 0)?

+1

Google ha escondido ese puesto por alguna razón inexplicable - ya no estamos autorizados a acceder a ella (me da a una página de inicio de sesión, una redirección forzada de Google.com) – Adam

Respuesta

0

(editado de nuevo porque no puedo borrar mi respuesta original después de haber sido aceptado en el crédito por esto es a Ian, que ha publicado una respuesta más completa a continuación :)

En la mayoría de los casos esto no sucederá. Si inicializas tu vista con un ancho y/o altura negativos, obtendrás un origen con una X negativa del ancho y/o una Y negativa de la altura.

+2

No creo que esto es cierto . He visto casos en los que algo en el sistema relacionado con el autoajuste parecía dejarme con límites donde el origen no era 0.0. En mi propio código, nunca, nunca establecí límites, así que tenerlo de repente presente un número distinto de cero fue un shock. –

+0

@KendallHelmstetterGelner de acuerdo. Esto me sucedió cuando tenía un controlador de navegación haciendo un cambio de tamaño de mi UIScrollView (creo que como resultado de la configuración "Ajustar ajustes de vista de desplazamiento"). – eremzeit

15

El bounds.origin será negativo si inicializa una vista con ancho/alto negativo. Por ejemplo, si se hizo

UIView* v = [[UIView alloc] initWithFrame:CGRectMake(5, 5, -10, -20)]; 

del marco sería:

origin = { 
    x = -5, 
    y = -15 
}, 
size = { 
    width = 10, 
    height = 20 
} 

límites:

origin = { 
    x = -10, 
    y = -20 
}, 
size = { 
    width = 10, 
    height = 20 
} 

centro:

x = 0, 
y = -5 

probarlo por ti mismo!

+0

Eso no tiene sentido. Es igual a la expresión "Origen del sistema de coordenadas relativo a sí mismo no igual a <0,0>" que es falso y no tiene sentido. – folex

+1

¿Por qué querrías crear una anchura y altura negativas? – Boon

+2

Tiene sentido o no, esos son los resultados que obtienes si ejecutas este código. –

21

Una de bounds.origin UIScrollView no será (0, 0) cuando su contentOffset no es (0, 0). marco

19

de vista determina su ubicación en supervista. Los límites de la vista determinan las ubicaciones de las subvistas . Eso significa que, si cambia los límites de la vista, su ubicación no cambiará, pero se cambiarán todas las ubicaciones de sus vistas.

anchura y la altura positiva es como se dibuja una vista desde parte superior izquierda a la parte inferior derecha, mientras que el valor negativo es de abajo a la derecha a superior izquierda. Así

frame1 = CGRectMake(100, 100, -50, -50) 

es totalmente idéntico a

frame2 = CGRectMake(50, 50, 50, 50). 

Y de hecho, si INIT una vista con frame1, se cambia automáticamente a Frame2.

Pero el bounds.origin de las vistas no son idénticos.Bounds.origin indica el punto que "dibuja" la vista, por lo que todas las tramas de las subvistas se originarán en este punto.

Por ejemplo, en el paisaje iPhone 6, tenemos:

UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 275, 275)]; 
leftView.backgroundColor = [UIColor greenColor]; 
[self.view addSubview:leftView]; 

UIView *rightView = [[UIView alloc] initWithFrame:CGRectMake(667-50, 375-50, -275, -275)]; 
rightView.backgroundColor = [UIColor blueColor]; 
[self.view addSubview:rightView]; 

Y tenemos:

enter image description here

Encontraremos que el marco de RightView se cambia automáticamente al valor positivo, que es (342, 50, 275, 275), pero es bounts.origin = (-275,-275).

y añadimos subvistas:

UIView *leftSubview = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; 
leftSubview.backgroundColor = [UIColor grayColor]; 
[leftView addSubview:leftSubview]; 
UIView *rightSubview= [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; 
rightSubview.backgroundColor = [UIColor grayColor]; 
[rightView addSubview:rightSubview]; 

enter image description here

Así los límites hace subvista de RightView sigue el origen que init RightView.

Si cambiamos los parámetros de la derechaVer es igual a la izquierdaVer: rightView.bounds = leftView.bounds; Luego, la ubicación de dos subViews es la misma, hemos perdido la información de que el ancho y el alto de rightView son negativos.

enter image description here

Y cambiamos los límites de leftView en lugar de RightView: CGRect grada = leftView.bounds; bounds.origin = CGPointMake (50, 50); leftView.bounds = bounds;

enter image description here

Podemos ver, frame.origin de su subvista se compensa con bounds.origin (utilizando menos, no más).

Para concluir:

  1. view.bounds determina todas las instalaciones de su subvista (compensado por bounds.origin), mientras que bounds no afectará a su propia ubicación en su supervista.

  2. Si inicia una vista con ancho y alto negativos, cambiará automáticamente a positivo (que no cambiará la ubicación), pero bounds.origin indica el punto en que comienza a "dibujar" la vista.

+0

Gran respuesta. "límites" es confuso porque da la impresión de que x, y es la posición de la vista para la cual se establece. ¿Por qué han vinculado las dimensiones de una vista a su origen local? –

+0

Una buena respuesta, gracias por tomarse el tiempo extra para explicar las cosas junto con las representaciones pictóricas. +1. –

Cuestiones relacionadas