Voglio spostare una vista sopra un'altra, come posso conoscere l'indice z della vista e come spostarsi verso l'alto?Come impostare l'indice di iPhone UIView z?
risposta
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.
È 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"
[parentView bringSubviewToFront:view] ;
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.
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)];
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,
l'obiettivo è per spostare una vista secondaria (diciamo verde) verso l'alto.
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.
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 logreenView
dall'indice0
a2
. Ciò può essere osservato conprint(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 logreenView
sembra essere in alto. Tuttavia, rimane ancora all'indice0
dell'arrayyellowView.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 suCGFloat.greatestFiniteMagnitude
(CGFloat(FLT_MAX)
nelle vecchie versioni di Swift) per assicurarsi che sia in cima.
All'interno della vista che si desidera portare al top ... (in rapido)
superview?.bringSubviewToFront(self)
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)
}
Proprio come un aiutante, grandi valori sono "in primo piano". Puoi usare qualsiasi valore tu voglia, compresi i valori negativi. –
Questa soluzione è migliore se vuoi che la tua vista sia sempre al top. Basta impostare zPosition su MAXFLOAT –
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" –