Come impostare l'indice UIView z di iPhone?


252

Voglio spostare una vista in cima a un'altra, come posso sapere l'indice z della vista e come andare in cima?

Risposte:


279

UIViewi fratelli vengono raggruppati nell'ordine in cui vengono aggiunti alla loro superview. I UIViewmetodi e le proprietà della gerarchia 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;

Le viste dei fratelli vengono ordinate di fronte subviewsall'array. Quindi la vista più in alto sarà:

[parentView.subviews lastObject];

e la vista dal basso sarà:

[parentView.subviews objectAtIndex:0];

Come Kolin Krewinkel ha detto, [parentView bringSubviewToFront:view]porterà la vista in alto, ma questo è solo il caso se le viste sono tutti fratelli nella gerarchia.


329

Puoi usare la zPositionproprietà del livello della vista (è un CALayeroggetto) per modificare l'indice z della vista.

theView.layer.zPosition = 1;

Come ha aggiunto Viktor Nordling , "i grandi valori sono in cima. Puoi usare tutti i valori che desideri, compresi i valori negativi". Il valore predefinito è 0.

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

#import "QuartzCore/QuartzCore.h"

7
Proprio come un aiuto, i grandi valori sono "al top". È possibile utilizzare tutti i valori desiderati, compresi i valori negativi.
Viktor Nordling,

12
Questa soluzione è migliore nel caso in cui desideri che la vista sia sempre in primo piano. Basta impostare zPosition su MAXFLOAT
Muhammad Hassan Nasr il

27
Ho appena appreso che zPosition del layer e il gestore di input di UIView sono su due diversi ordini Z. È davvero strano quando i tuoi clic "passano"
Stephen J,

la superview delle viste deve essere la stessa per far zPositionfunzionare le opere?
Hlung,

3
Ho notato che, anche se la vista è in alto, i clic la attraversano fino agli oggetti sottostanti. Questo dovrebbe essere considerato un bug. Sto cercando di trovare un modo generale per evitare quel problema, senza dover disabilitare esplicitamente le interazioni dell'utente di tutte le viste che si trovano sotto.
Bruce Patin,

103

IB e Swift

Dato il layout scorrevole in cui il giallo è la superview e rosso, verde e blu sono le sottovoci di giallo del fratello,

viste - vista rossa in alto

l'obiettivo è spostare una sottoview (diciamo verde) in alto.

viste - vista verde in alto

In Interface Builder

In Interface Builder è sufficiente trascinare la vista che si desidera visualizzare nella parte superiore in fondo all'elenco nella Struttura dei documenti.

ordine delle viste in Interface Builder

In alternativa, è possibile selezionare la vista e quindi nel menu andare su Editor> Disponi> Invia in primo piano .

In Swift

Esistono un paio di modi diversi per farlo a livello di codice.

Metodo 1

yellowView.bringSubviewToFront(greenView)
  • Questo metodo è l'equivalente programmatico della risposta IB sopra.

  • Funziona solo se le visualizzazioni secondarie sono fratelli l'una dell'altra.

  • Un array di sottoview è contenuto in yellowView.subviews. Qui, bringSubviewToFrontsposta l' greenViewindice 0in 2. Questo può essere osservato con

      print(yellowView.subviews.indexOf(greenView))

Metodo 2

greenView.layer.zPosition = 1
  • Questo metodo sposta semplicemente la posizione 3D del livello più in alto (più vicino all'utente) sull'asse z. Poiché il valore predefinito è 0per tutte le altre viste, il risultato è che greenViewsembra in cima. Tuttavia, rimane ancora all'indice 0della yellowView.subviewsmatrice. Ciò può causare alcuni risultati imprevisti, tuttavia, perché cose come gli eventi di tocco passeranno comunque alla vista con il numero di indice più alto. Per questo motivo, potrebbe essere meglio seguire il metodo 1 sopra.
  • Il zPositionpotrebbe essere impostato CGFloat.greatestFiniteMagnitude( CGFloat(FLT_MAX)nelle vecchie versioni di Swift) per assicurarsi che sia in cima.

grazie per questo ... ho passato 8 ore a cercare di capirlo. yellowView.bringSubviewToFront (greenView) ha funzionato perfettamente.
MizAkita

È interessante notare che le visualizzazioni dei container non rispettano questo! A quanto pare, devi spostarli manualmente nel codice.
Fattie l'


19

Se vuoi farlo tramite Interface Builder di XCode, puoi usare le opzioni di menu in Editor-> Disposizione. Lì troverai "Invia in primo piano", "Invia in secondo piano", ecc.


Cosa succede se le opzioni di Arrange sono disabilitate?
5

9

Nella vista che vuoi portare in cima ... (in breve tempo)

superview?.bringSubviewToFront(self)

btnDOWN.superview? .bringSubview (toFront: btnDOWN)
Criss

4

Se stai usando cocos2d, potresti riscontrare un problema con [parentView bringSubviewToFront: view], almeno non funzionava per me. Invece di portare la vista che volevo in primo piano, rimando indietro le altre viste e questo ha funzionato.

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

2

Possiamo usare zPosition in iOS

se abbiamo una vista chiamata salonDetailView es:@IBOutlet weak var salonDetailView: UIView!

Nel mio caso vedi l'immagine

e avere UIView per GMSMapView ad esempio:@IBOutlet weak var mapViewUI: GMSMapView!

Per mostrare la vista saloneDetailVedere la parte superiore della mapViewUI

usa zPosition come di seguito

salonDetailView.layer.zPosition = 1

si prega di pubblicare foto e codice direttamente qui nella risposta, per facilitare l'ottenimento da parte di OP.
skratchi.at il

come principiante, StackOverflow non mi permetterà di scusarmi. puoi controllare l'immagine del problema i.stack.imgur.com/d9Cx3.png
abhijith k

0

O usa questo

- (void)insertSubview:(UIView *)view belowSubview:(UIView*)siblingSubview;

come da qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.