ios - ¿Cómo configurar el índice iPhone UIView z?
position z-index (8)
Quiero mover una vista sobre otra, ¿cómo puedo saber el índice z de la vista y cómo pasar a la parte superior?
Dentro de la vista que desea traer a la cima ... (en rapidez)
superview?.bringSubviewToFront(self)
Me gusta ajustar la interfaz de usuario en la interfaz de interfaz de usuario de guión gráfico. Uso la 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)
}
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 valores grandes están en la parte superior. Puedes usar cualquier valor que desees, incluidos los valores negativos". El valor predeterminado es 0.
Debe importar el marco de QuartzCore para acceder a la capa. Solo agregue esta línea de código en la parte superior de su archivo de implementación.
#import "QuartzCore/QuartzCore.h"
Si desea hacer esto a través de Interface Builder de XCode, puede usar las opciones de menú en Editor-> Arrangement. Allí encontrarás "Enviar al frente", "Enviar al fondo", etc.
Si está utilizando cocos2d, puede ver un problema con [parentView bringSubviewToFront: view], al menos no funcionó para mí. En lugar de llevar la vista que quería al frente, envío las otras vistas de vuelta y eso fue todo.
[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)];
UIView
hermanos UIView
se apilan en el orden en que se agregan a su supervisión. Los métodos y las propiedades de la jerarquía 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 al revés en la matriz de subviews
. Así que la vista superior será:
[parentView.subviews lastObject];
y la vista inferior será:
[parentView.subviews objectAtIndex:0];
Como dijo Kolin Krewinkel, [parentView bringSubviewToFront:view]
traerá la vista a la cima, pero esto es solo el caso si las vistas son todos hermanos en la jerarquía.
IB y Swift
Dada la distribución fluida, donde amarillo es la vista de supervisión y rojo, verde y azul son subvistas de amarillo de hermanos,
el objetivo es mover una subvista (digamos verde) a 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 Esquema de documentos.
Alternativamente, puede seleccionar la vista y luego en el menú ir 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 del IB anterior.
- Sólo funciona si las subvistas son hermanos entre sí.
Una matriz de las subvistas está contenida en
yellowView.subviews
. Aquí,bringSubviewToFront
mueve elgreenView
del índice0
al2
. Esto se puede observar conprint(yellowView.subviews.indexOf(greenView))
Método 2
greenView.layer.zPosition = 1
- Este método solo mueve la posición 3D de la capa más arriba (más cerca del usuario) en el eje z. Dado que el valor predeterminado es
0
para todas las demás vistas, el resultado es que elgreenView
parece que está en la parte superior. Sin embargo, aún permanece en el índice0
de la matrizyellowView.subviews
. Sin embargo, esto puede causar algunos resultados inesperados, ya que cosas como los eventos de tap aún irán primero a la vista con el número de índice más alto. Por esa razón, podría ser mejor ir con el Método 1 anterior. - La
zPosition
podría establecerse enCGFloat.greatestFiniteMagnitude
(CGFloat(FLT_MAX)
en versiones anteriores de Swift) para asegurarse de que está en la parte superior.
[parentView bringSubviewToFront:view] ;