2009-05-05 12 views

Respuesta

14

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

¿No puedes simplemente usar este código en tu ciclo?

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

El resultado sería que la vista añade en primer lugar se encuentra en la parte superior de la pila de vista (no he podido probar esto todavía aunque :))

+0

¿Qué pasaría si todos tienen el mismo índice? – Thanks

+1

Bueno, no pueden, desde que se agrega un índice de att 0 para un ejemplo, derriba a todos los demás en la pila. – ullmark

3

No directamente.

Una solución sería darle a UIViews una propiedad z-index; un número entero que define su nivel de profundidad. Luego podría iterar a través de un NSArray (myArray) que contenga las UIViews y agregarlas como subvistas por orden de profundidad.

2

En realidad, hasta donde yo sé, no hay una posición de posición z-index para eso. Dibujar en la vista utiliza un modelo de dibujo simple.

Puede poner su lógica en el bucle de dibujo (es decir, dibujar las cosas que desee en último lugar) o puede usar Cocoa Animation, ya que a diferencia de UIImageView, CALayers tiene profundidad (son una proyección 2D de un espacio 3D) Ver here para una referencia.

+0

sí, pensamiento, cada UIImageView es una especie de basa en un CALayer? – Thanks

+0

Sí, ahora que lo pienso, en el iPhone todas las vistas están respaldadas por capas. Cavando un poco, encontré los siguientes métodos en UIImageView documentos: - InsertSubview: aboveSubview: - insertSubview: belowSubview: – Hejazzman

19

en lugar de utilizar insertSubiew se puede intentar:

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

Esta técnica funciona bien para una situación en la que está agregando una imagen (u otra vista) programáticamente, y desea llevarla al fondo. En mi caso, tengo algunas etiquetas instaladas en Interface Builder, pero estoy agregando una imagen de fondo estirable en el código. Sin usar sendSubviewToBack :, la imagen de fondo aparece en la parte superior de las etiquetas. –

1

Es posible que desee considerar el uso de CALayer en lugar de muchos objetos UIImageView. Los objetos UIImageView son geniales, pero para el dibujo intenso los CALayer son más livianos y más eficientes (aunque si necesitas 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 usa UIKit cuando organiza la posición de UIView en la pila de vistas.

3

Tuve el mismo problema. Necesitaba el elemento de subvista con el índice z más alto y más bajo. De mis pruebas descubrí que UIKit organiza los elementos en las subvistas-propiedad de acuerdo con su posición z. Si toma [self.scrollview subviews] por ejemplo. El primer elemento de matriz es la subvista que está en la parte posterior. El elemento de matriz con el índice más alto es la subvista en el frente. Si usa

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

la matriz de subvistas se reordenará en consecuencia.

3

Si tiene que el árbitro la vista por debajo/por encima de lo necesario para añadir el punto de vista secundario se puede utilizar el siguiente

[self.view insertSubview:<#(UIView *)#> belowSubview:<#(UIView *)#>]; 
[self.view insertSubview:<#(UIView *)#> aboveSubview:<#(UIView *)#>]; 
1
imageView.layer.zPosition = 100; 
6

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

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

theView.layer.zPosition = 1; 

Como añadió Viktor Nordling, "valores grandes están en la parte superior. Se puede utilizar cualquier valor que desee, incluyendo 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" 

otra manera (https://stackoverflow.com/a/4663526/2482283), también se 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; 
Cuestiones relacionadas