ios - corner - xcode border radius
Reordenando subvistas de UIView (3)
No es necesario eliminar de superview:
[self.superview insertSubview:self atIndex:zPosition];
En mi aplicación, intento traer una subvista al frente y luego volver a colocarla en su posición original. El código debería ser bastante simple:
Para llevar la subvista al frente (dentro de mi clase UIView personalizada):
[self.superview bringSubviewToFront:self];
Fácil. zPosition
posición z original en una variable de instancia llamada, adivinó, zPosition
. Entonces, la línea antes de -bringSubviewToFront:
es:
zPosition = [self.superview.subviews indexOfObject:self];
Entonces, todo el código que uso para llevar mi subvista al frente es:
zPosition = [self.superview.subviews indexOfObject:self];
[self.superview bringSubviewToFront:self];
Esto funciona como debería. El problema es cuando trato de volver a colocar la subvista donde estaba. Simplemente estoy haciendo esto:
[self.superview exchangeSubviewAtIndex:zPosition withSubviewAtIndex:
[self.superview.subviews indexOfObject:self]];
Usando este código, si tengo dos subvistas, esto es lo que sucede:
Digamos que tengo la vista A y la vista B. La vista A es la vista superior B. Toco la vista B, viene al frente. Toco la vista B otra vez (debe volver a donde estaba), y no pasa nada, por lo que ahora está en la vista A. Si ahora toco la vista A, viene al frente, pero cuando lo toco de nuevo (por lo que debería vuelve a su posición z original: debajo de la vista B), todas las vistas de hermanos desaparecen.
¿Alguien ve qué podría estar causando este problema?
exchangeSubviewAtIndex puede poner la vista en el lugar correcto, pero también cambiará otra vista en la parte superior, que no será con la que comenzó. Es posible que deba hacer algo como esto en lugar de exchangeSubviewAtIndex:
[self retain];
UIView *superview = self.superview;
[self removeFromSuperview];
[superview insertSubview:self atIndex:zPosition];
[self release];
Esta pregunta y respuestas fueron muy útiles para mí.
Tuve el requisito de colocar una superposición entre el viewstack cuyas vistas están encima y debajo de la superposición, y quería mantenerlo dinámico. Es decir, una vista puede decir que está oculta o no.
Usé el siguiente algoritmo para reordenar las vistas. Gracias a AW101 a continuación para "No hay necesidad de eliminar la vista".
Aquí está mi algoritmo:
- (void) insertOverlay {
// Remember above- and belowcounter
int belowpos = 0, abovepos = 0;
// Controller mainview
UIView *mainview = [self currentMainView];
// Iterate all direct mainview subviews
for (UIView* view in mainview.subviews) {
if ([self isAboveOverlay:view]) {
// Re-insert as aboveview
[mainview insertSubview:view atIndex:belowpos + (abovepos++)];
}
else {
// Re-insert as belowview
[mainview insertSubview:view atIndex:belowpos++];
}
}
// Put overlay in between above and below.
[mainview insertSubview:_overlay atIndex:belowpos];
}