2009-05-05 10 views

risposta

14

Lei ha detto che hai utilizzato UIImageView. Disegnare un'immagine con UIImageView significa inizializzarlo e quindi aggiungerlo a una vista contenitore.

Non puoi semplicemente utilizzare questo codice nel tuo ciclo?

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

Il risultato sarebbe che la vista aggiunto prima è in cima alla pila vista (non sono stato in grado di testare questo ancora però :))

+0

cosa accadrebbe se tutti avessero lo stesso indice? – Thanks

+1

Bene, non possono aggiungere un indice att per 0 per un esempio, facendo un salto verso il basso tutti gli altri nello stack. – ullmark

3

Non direttamente.

Una soluzione avrebbe dato i UIViews una proprietà z-index; un numero intero che definisce il tuo livello di profondità. Quindi puoi itterare attraverso un NSArray (myArray) contenente le UIViews aggiungendole come subviews in ordine di profondità.

2

In realtà, per quanto ne so, non esiste una proprietà posizione di z-index per questo. Il disegno nella vista utilizza un modello di disegno semplice.

È possibile inserire la logica nel ciclo di disegno (es. Disegnare le cose che si desidera per ultimo) oppure utilizzare Cocoa Animation, poiché a differenza di UIImageView, i CALayer hanno profondità (sono una proiezione 2D di uno spazio 3D). Vedi here per un riferimento.

+0

Sì, ho pensato ogni UIImageView è una specie di basa su un CALayer? – Thanks

+0

Sì, vieni a pensarci, nell'iPhone tutte le viste sono supportate da livelli. Scavando un po ', ho trovato i seguenti metodi nei documenti UIImageView: - insertSubview: aboveSubview: - insertSubview: belowSubview: – Hejazzman

19

invece di utilizzare insertSubiew voi può provare:

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

Questa tecnica funziona bene per una situazione in cui si aggiunge un'immagine (o altra vista) a livello di programmazione e si desidera spostarla sullo sfondo. Nel mio caso ho impostato alcune etichette in Interface Builder, ma aggiungo un'immagine di sfondo estensibile nel codice. Senza usare sendSubviewToBack :, l'immagine di sfondo appare sopra le etichette. –

1

Si potrebbe davvero prendere in considerazione l'utilizzo di CALayer invece di un sacco di oggetti UIImageView. Gli oggetti UIImageView sono fantastici ma per i disegni intensi i CALayer sono più leggeri e più efficienti (anche se è necessario che un utente interagisca con le immagini, un oggetto vista è migliore). Dipende davvero da cosa stai facendo. I CALayer hanno una proprietà zPosition. Questo è ciò che Uikit usa quando organizza la posizione di UIView nello stack di visualizzazione.

3

Ho avuto lo stesso problema. Avevo bisogno dell'elemento subview con lo z-index più alto e più basso. Dalla mia verifica ho scoperto che UIKit dispone gli elementi nella proprietà submviews in base alla loro posizione z. Ad esempio, se si prende [self.scrollview subviews] . Il primo elemento dell'array è la sottoview che si trova nella parte posteriore. L'elemento dell'array con l'indice più alto è la sottoview in primo piano. Se si utilizza

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

la matrice di sottoview verrà riordinata di conseguenza.

3

Se avete l'arbitro alla vista sotto/sopra è necessario aggiungere la vista secondaria è possibile utilizzare il seguente

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

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

È possibile utilizzare la proprietà zPosition del view's layer (è un oggetto CALayer) per cambiare l'indice z della vista.

theView.layer.zPosition = 1; 

Come Viktor Nordling ha aggiunto, "i grandi valori sono in cima. È possibile utilizzare qualsiasi valori desiderati, inclusi i valori negativi." Il valore predefinito è 0.

È necessario importare il framework QuartzCore per accedere al livello. Basta aggiungere questa riga di codice nella parte superiore del file di implementazione.

#import "QuartzCore/QuartzCore.h" 

altro modo (https://stackoverflow.com/a/4663526/2482283), è possibile anche utilizzare UIViews metodo:

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