¿Hay alguna forma de establecer algún tipo de índice z para la posición z de los objetos UIImageView?

StackOverflow https://stackoverflow.com/questions/826068

Pregunta

Estoy creando una cuadrícula de imágenes, y comienzo en la parte superior, creando objetos UIImageView por todo el lugar. Ahora quiero que se superpongan un poco, pero los últimos que dibujé son los que están más arriba. Me gustaría establecer la posición z programáticamente, para que los primeros que dibuje sean los que más se encuentren arriba.

¿Fue útil?

Solución

Dijiste que usaste UIImageView. Dibujar una imagen con UIImageView significa inicializarla y luego agregarla a una vista de contenedor.

¿No puedes usar este código en tu bucle?

[containerView insertSubview:image atIndex:[[containerView subviews] count]]

El resultado sería que la vista que se agregó primero se encuentra en la parte superior de la pila de vistas (aunque aún no he podido probar esto)

Otros consejos

en lugar de usar insertSubiew puedes probar:

- (void)bringSubviewToFront:(UIView *)view
- (void)sendSubviewToBack:(UIView *)view

https://stackoverflow.com/a/4631895/2482283

Puedes 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 parte superior. Puede utilizar los valores que desee, incluidos los valores negativos. & Quot; El valor predeterminado es 0.

Es necesario importar el marco de 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"

de otra manera ( https://stackoverflow.com/a/4663526/2482283 ), también puede utilizar uiviews método:

@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;

No directamente.

Una solución sería otorgar a UIViews una propiedad de índice z; un entero que define su nivel de profundidad. Luego, puede iterar en una NSArray (myArray) que contiene las UIViews y las agrega como subvistas por orden de profundidad.

Tuve el mismo problema. Necesitaba el elemento de subvista con el índice z más alto y más bajo. A partir de mis pruebas, descubrí que UIKit organiza los elementos en la propiedad subviews de acuerdo con su posición z. Si lo tomas [subvistas self.scrollview] por ejemplo. El primer elemento de la matriz es la subvista que se encuentra en la parte posterior. El elemento de la matriz con el índice más alto es la subvista en la parte frontal. Si usas

- (void)bringSubviewToFront:(UIView *)view
- (void)sendSubviewToBack:(UIView *)view`

la matriz de subvistas se reordenará en consecuencia.

Si tiene la referencia a la vista de abajo / arriba, necesita agregar la subvista, puede usar lo siguiente

[self.view insertSubview:<#(UIView *)#> belowSubview:<#(UIView *)#>];
[self.view insertSubview:<#(UIView *)#> aboveSubview:<#(UIView *)#>];

En realidad, hasta donde sé, no hay ninguna propiedad de posición de índice z para eso. El dibujo en la vista utiliza un modelo de dibujo simple.

Puedes poner tu lógica en el bucle de dibujo (es decir, dibujar las cosas que quieres en último lugar) o puedes usar Cocoa Animation, ya que a diferencia de UIImageView, los CALayers sí tienen profundidad (son una proyección 2D de un espacio 3D) . Consulte aquí para una referencia.

Es posible que desee considerar usar CALayer's en lugar de muchos objetos UIImageView. Los objetos UIImageView son excelentes, pero para un dibujo intenso, CALayer es más liviano y más eficiente (aunque si necesita que un usuario interactúe con las imágenes, un objeto de vista es mejor). Realmente depende de lo que estés haciendo. CALayers tienen una propiedad zPosition. Esto es lo que UIKit usa cuando organiza la posición de UIView en la pila de vistas.

imageView.layer.zPosition = 100;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top