2011-01-08 17 views

risposta

259

UIView fratelli sono impilati nell'ordine in cui vengono aggiunti al loro superview. I metodi e le proprietà della gerarchia UIView sono lì per gestire l'ordine di visualizzazione. In 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; 

I punti di vista di pari livello sono ordinate dietro in avanti nella matrice subviews. Quindi la vista più in alto sarà:

[parentView.subviews lastObject]; 

e vista dal basso sarà:

[parentView.subviews objectAtIndex:0]; 

Come Kolin Krewinkel detto, [parentView bringSubviewToFront:view] porterà la vista verso l'alto, ma questo è solo il caso se il punto di vista sono tutti fratelli nella gerarchia.

287

È possibile utilizzare la proprietà zPosition del livello di vista (è un oggetto CALayer) per modificare l'indice z della vista.

theView.layer.zPosition = 1; 

Come Viktor Nordling aggiunto, "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" 
+6

Proprio come un aiutante, grandi valori sono "in primo piano". Puoi usare qualsiasi valore tu voglia, compresi i valori negativi. –

+11

Questa soluzione è migliore se vuoi che la tua vista sia sempre al top. Basta impostare zPosition su MAXFLOAT –

+23

Ho appena appreso che la zPosition del livello e il gestore di input di UIView sono su due ordini Z diversi. È davvero strano quando i tuoi clic "passano" –

69
[parentView bringSubviewToFront:view] ; 
15

Se si desidera eseguire questa operazione tramite Interface Builder di XCode, è possibile utilizzare le opzioni di menu sotto Editor-> Arrangiamento. Lì troverai "Invia in primo piano", "Invia indietro", ecc.

4

Se stai usando cocos2d, potresti vedere un problema con [parentView bringSubviewToFront: view], almeno non funzionava per me . Invece di portare il punto di vista che volevo in primo piano, invio le altre visualizzazioni indietro e questo ha fatto il trucco.

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

IB e Swift

Dato il layout che scorre in cui il giallo è il superview e rosso, verde e blu sono di pari livello subviews di giallo,

views - red view on top

l'obiettivo è per spostare una vista secondaria (diciamo verde) verso l'alto.

views - green view on top

In Interface Builder

In Interface Builder tutto quello che dovete fare è trascinare la vista che si desidera che mostra nella parte superiore alla parte inferiore della lista nella Outline Documenti.

order of views in Interface Builder

In alternativa, è possibile selezionare la vista e poi nel menu di andare a Editor> Disponi> in primo piano.

In Swift

Ci sono un paio di modi diversi per fare questo livello di programmazione.

Metodo 1

yellowView.bringSubviewToFront(greenView) 
  • Questo metodo è l'equivalente di programmazione della risposta IB sopra.
  • Funziona solo se i sottoview sono fratelli l'uno dell'altro.
  • Un array di subviews è contenuto in yellowView.subviews. Qui, bringSubviewToFront sposta lo greenView dall'indice 0 a 2. Ciò può essere osservato con

    print(yellowView.subviews.indexOf(greenView)) 
    

Metodo 2

greenView.layer.zPosition = 1 
  • questo metodo appena sposta la posizione 3D dello strato superiore (più vicino all'utente) sulla z . Poiché il valore predefinito è 0 per tutte le altre visualizzazioni, il risultato è che lo greenView sembra essere in alto. Tuttavia, rimane ancora all'indice 0 dell'array yellowView.subviews. Ciò può causare alcuni risultati imprevisti, tuttavia, perché cose come gli eventi tap andranno prima alla vista con il numero indice più alto. Per questo motivo, potrebbe essere meglio seguire il Metodo 1 sopra.
  • Il zPosition potrebbe essere impostato su CGFloat.greatestFiniteMagnitude (CGFloat(FLT_MAX) nelle vecchie versioni di Swift) per assicurarsi che sia in cima.
+0

grazie per questo ... ho trascorso 8 ore cercando di capirlo. yellowView.bringSubviewToFront (greenView) ha funzionato perfettamente. – MizAkita

+0

È interessante notare che ** view del contenitore ** non rispettano questo! Devi spostarli manualmente nel codice, a quanto pare. – Fattie

5

All'interno della vista che si desidera portare al top ... (in rapido)

superview?.bringSubviewToFront(self) 
0

mi piace per regolare interfaccia utente in un'interfaccia utente storyboard. Io uso tag per indicare lo z-Index di quella vista.

a Swift 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) 
} 
Problemi correlati