framework - uikit ios
¿Cuándo no sería(0, 0) los límites de orígenes de un UIView? (4)
¿Cuándo no sería (0, 0)
límites de bounds.origin
un UIView?
Esta publicación me fue útil:
¡¡IMPORTANTE!! Los límites X e Y, el origen, son para moverse dentro de la Vista. Para el ejemplo 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 sobre él lo que se ve afectado.
Pero solo describe el caso cuando establecí el valor de los bounds.origin
. bounds.origin
mismo.
¿En qué otros casos el valor de los bounds.origin != (0, 0)
?
(Editado de nuevo porque no puedo eliminar mi respuesta original después de que fue aceptada; el mérito de esto se otorga a ian, quien publicó una respuesta más completa a continuación)
En la mayoría de los casos, esto no sucederá. Si inicia su vista con un ancho y / o altura negativos, obtendrá un origen con un X negativo del ancho y / o Y negativo de la altura.
El bounds.origin será negativo si inicializa una vista con ancho / altura negativos. Por ejemplo, si lo hiciste
UIView* v = [[UIView alloc] initWithFrame:CGRectMake(5, 5, -10, -20)];
el 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
}
centrar:
x = 0,
y = -5
¡pruébalo tú mismo!
El marco de la vista determina su ubicación en supervisión . Los límites de la vista determinan sus ubicaciones de subvistas . Eso significa que, si cambia los límites de la vista, su ubicación no se cambiará, pero se cambiará toda la ubicación de sus subvistas.
El ancho y la altura positivos son como dibujar una vista desde la parte superior izquierda a la parte inferior derecha, mientras que el valor negativo es desde la parte inferior derecha a la superior izquierda. Asi que
frame1 = CGRectMake(100, 100, -50, -50)
es totalmente idéntico
frame2 = CGRectMake(50, 50, 50, 50).
Y, de hecho, si inicia una vista con frame1, se CAMBIARÁ AUTOMÁTICAMENTE a frame2.
Pero los bounds.origin
de las vistas no son idénticos. Bounds.origin
indica el punto en el que "dibuja" la vista, por lo que todos los marcos de subvistas se originarán en este punto.
Por ejemplo, en Landscape 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:
Encontraremos que el marco de rightView se cambia automáticamente a un valor positivo, que es (342, 50, 275, 275), pero sus bounts.origin = (-275,-275)
.
Y agregamos 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];
Entonces, los límites hacen que la subvista RightView siga el origen que iniciamos con rightView.
Si cambiamos los límites de rightView es igual a leftView: rightView.bounds = leftView.bounds; Entonces, la ubicación de las dos subvistas es la misma, perdimos la información de que el ancho y el alto de rightView son negativos.
Y cambiamos los límites de leftView en lugar de rightView: CGRect bounds = leftView.bounds; lines.origin = CGPointMake (50, 50); leftView.bounds = límites;
Podemos ver que el marco de su subvista. El origen está desplazado por los límites del origen (usando menos, no más).
Para concluir:
view.bounds
determina toda la ubicación de su subvista (offset by limits.origin), mientras que losbounds
no afectarán a su propia ubicación en su superview.Si inicia una vista con ancho y altura negativos, cambiará automáticamente a positivo (lo que no cambiará la ubicación), pero sus límites. El origen indica el punto en el que comienza a "dibujar" la vista.
Los límites de orígenes de un UIScrollView no serán (0, 0) cuando su contentOffset no sea (0, 0).