¿Cómo configurar el índice de iPhone UIView z?

Quiero mover una vista encima de otra, ¿cómo puedo saber el índice z de la vista y cómo pasar a la cima?

UIView hermanos UIView se astackn en el orden en que se agregan a su supervista. Los métodos y propiedades de jerarquía de UIView están ahí para administrar el orden de vista. En UIView.h:

 @property(nonatomic,readonly) UIView *superview; @property(nonatomic,readonly,copy) NSArray *subviews; - (void)removeFromSuperview; - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index; - (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2; - (void)addSubview:(UIView *)view; - (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview; - (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview; - (void)bringSubviewToFront:(UIView *)view; - (void)sendSubviewToBack:(UIView *)view; 

Las vistas de hermanos se ordenan de atrás hacia delante en la matriz de subviews . Entonces la vista más alta será:

 [parentView.subviews lastObject]; 

y la vista inferior será:

 [parentView.subviews objectAtIndex:0]; 

Al igual que Kolin Krewinkel, dijo, [parentView bringSubviewToFront:view] traerá la vista a la cima, pero este solo es el caso si todas las vistas son hermanos en la jerarquía.

Puede usar la propiedad zPosition de la capa de la vista (es un objeto CALayer ) para cambiar el índice Z de la vista.

 theView.layer.zPosition = 1; 

Como agregó Viktor Nordling , “los grandes valores están en la cima. Puedes usar cualquier valor que desees, incluidos los valores negativos”. El valor predeterminado es 0.

Debe importar el marco QuartzCore para acceder a la capa. Simplemente agregue esta línea de código en la parte superior de su archivo de implementación.

 #import "QuartzCore/QuartzCore.h" 
 [parentView bringSubviewToFront:view] ; 

IB y Swift

Dado el diseño fluido, donde el amarillo es la supervista y el rojo, el verde y el azul son las subvistas de hermanos de color amarillo,

vistas - vista roja en la parte superior

el objective es mover una subvista (digamos verde) a la parte superior.

vistas - vista verde en la parte superior

En Interface Builder

En Interface Builder, todo lo que necesita hacer es arrastrar la vista que desea mostrar en la parte superior a la parte inferior de la lista en el Resumen de documentos.

orden de las vistas en Interface Builder

Alternativamente, puede seleccionar la vista y luego en el menú vaya a Editor> Organizar> Enviar al frente .

En Swift

Hay un par de maneras diferentes de hacer esto programáticamente.

Método 1

 yellowView.bringSubviewToFront(greenView) 
  • Este método es el equivalente programático de la respuesta IB anterior.
  • Solo funciona si las subvistas son hermanos el uno del otro.
  • Una matriz de las subvistas está contenida en yellowView.subviews . Aquí, bringSubviewToFront mueve la vista greenView del índice 0 a 2 . Esto se puede observar con

     print(yellowView.subviews.indexOf(greenView)) 

Método 2

 greenView.layer.zPosition = 1 
  • Este método simplemente mueve la posición 3D de la capa más arriba (más cerca del usuario) en el eje z. Como el valor predeterminado es 0 para todas las demás vistas, el resultado es que greenView parece estar en la parte superior. Sin embargo, aún permanece en el índice 0 de la matriz yellowView.subviews . Sin embargo, esto puede causar algunos resultados inesperados, ya que cosas como los eventos de toque seguirán primero en la vista con el número de índice más alto. Por esa razón, podría ser mejor seguir el Método 1 anterior.
  • zPosition podría establecerse en CGFloat.greatestFiniteMagnitude ( CGFloat(FLT_MAX) en versiones anteriores de Swift) para garantizar que esté en la parte superior.

Si desea hacer esto a través de Interface Builder de XCode, puede usar las opciones del menú bajo Editor-> Arrangement. Allí encontrará “Enviar al frente”, “Enviar al dorso”, etc.

Dentro de la vista que quieres llevar a la cima … (en rápido)

 superview?.bringSubviewToFront(self) 

Si está utilizando cocos2d, es posible que vea un problema con [parentView bringSubviewToFront: view], al menos no funcionaba para mí. En lugar de traer la vista que quería al frente, les envío las otras vistas y eso fue todo.

 [[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)]; 

Me gusta ajustar la interfaz de usuario en la interfaz de interfaz de usuario del guión gráfico. Uso tag para indicar el z-Index esas vistas.

En veloz 3

 // Connect to those views, who need to adjust their z position. @IBOutlet var viewSetZIndex: [UIView]! // In `viewDidLoad`, or `awakeFromNib` for v in viewSetZIndex { // Use `tag` to adjust `zPosition` v.layer.zPosition = CGFloat(v.tag) }