2012-07-18 18 views
10

En mi aplicación, intento traer una subvista al frente, luego volver a ponerla en su posición de capa original más adelante. El código debe ser bastante simple:Reordenar las subvistas de UIView

Para llevar a la subvista frontal (dentro de mi clase UIView personalizado):

[self.superview bringSubviewToFront:self]; 

fácil. Guardo la posición z original en una variable de instancia llamada, lo adivinaste, zPosition. Así, la línea antes de -bringSubviewToFront: es:

zPosition = [self.superview.subviews indexOfObject:self]; 

Por lo tanto, todo el código que utilizo para llevar a mi subvista a delante 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 B. Vista Vista A es superior ver B. Toco ver 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 lo que podría estar causando este problema?

+0

tal vez usted puede comenzar con un maniquí, subvista vacío en la parte superior. Luego cambias hacia adelante y hacia atrás con esa subvista. No es el más elegante, lo sé ... –

Respuesta

11

exchangeSubviewAtIndex puede devolver la vista en el lugar correcto, pero también cambiará otra vista en la parte superior, que no será lo que comenzó. Puede que tenga que hacer algo como esto en vez de exchangeSubviewAtIndex:

[self retain]; 
UIView *superview = self.superview; 
[self removeFromSuperview]; 
[superview insertSubview:self atIndex:zPosition]; 
[self release]; 
+0

al llamar a '[self removeFromSuperview]' da como resultado que 'self' sea desasignado porque una vez que se elimina de su supervista, ya no se posee nada. –

+0

¿Quizás podría delegar esto en la supervista (y/o el controlador de vista a cargo de esta jerarquía) en su lugar? –

+0

Trate de retener su auto temporalmente. He actualizado mi respuesta. – AW101

9

No hay necesidad de quitar de supervista:

[self.superview insertSubview:self atIndex:zPosition];

0

Esta pregunta y las respuestas fueron muy útiles para mí.

Tuve el requerimiento de colocar una superposición entre la vista donde las vistas están encima y debajo de la superposición, y quería mantenerla dinámica. Es decir, una vista puede decir que está oculta o no.

Utilicé el siguiente algoritmo para reordenar las vistas. Gracias a AW101 a continuación para "No hay necesidad de eliminar la vista".

Aquí es 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]; 
} 
Cuestiones relacionadas