Respostas:
UIViewos irmãos são empilhados na ordem em que são adicionados à sua superview. Os UIViewmétodos e propriedades da hierarquia estão lá para gerenciar a ordem de exibição. No 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;
As visualizações dos irmãos são ordenadas de volta à frente na subviewsmatriz. Portanto, a vista superior será:
[parentView.subviews lastObject];
e a vista inferior será:
[parentView.subviews objectAtIndex:0];
Como Kolin Krewinkel disse, [parentView bringSubviewToFront:view]trará a visão para o topo, mas este é apenas o caso se as visões forem todos irmãos na hierarquia.
Você pode usar a zPositionpropriedade da camada da vista (é um CALayerobjeto) para alterar o índice z da vista.
theView.layer.zPosition = 1;
Como Viktor Nordling acrescentou, "grandes valores estão no topo. Você pode usar qualquer valor que desejar, incluindo valores negativos". O valor padrão é 0.
Você precisa importar a estrutura QuartzCore para acessar a camada. Basta adicionar esta linha de código na parte superior do seu arquivo de implementação.
#import "QuartzCore/QuartzCore.h"
zPositionobras funcionem?
IB e Swift
Dado o layout em que o amarelo é a super visão geral e o vermelho, o verde e o azul são subviews irmãos de amarelo,
o objetivo é mover uma subvisão (digamos verde) para o topo.
No Construtor de interface, tudo o que você precisa fazer é arrastar a exibição que você deseja exibir, de cima para baixo na lista, no esquema de documentos.
Como alternativa, você pode selecionar a visualização e, em seguida, no menu, vá para Editor> Organizar> Enviar para frente .
Existem algumas maneiras diferentes de fazer isso programaticamente.
Método 1
yellowView.bringSubviewToFront(greenView)
Este método é o equivalente programático da resposta do IB acima.
Só funciona se as subvisões forem irmãos um do outro.
Uma matriz das subvisões está contida yellowView.subviews. Aqui, bringSubviewToFrontmove o greenViewíndice de 0para 2. Isso pode ser observado com
print(yellowView.subviews.indexOf(greenView))
Método 2
greenView.layer.zPosition = 1
0para todas as outras visualizações, o resultado é que greenViewparece que está no topo. No entanto, ele ainda permanece no índice 0da yellowView.subviewsmatriz. No entanto, isso pode causar resultados inesperados, porque coisas como eventos de toque ainda irão primeiro para a exibição com o número de índice mais alto. Por esse motivo, talvez seja melhor seguir o método 1 acima.zPositionpoderia ser ajustado para CGFloat.greatestFiniteMagnitude( CGFloat(FLT_MAX)em versões mais antigas do Swift) para garantir que ele está no topo.[parentView bringSubviewToFront:view] ;
Dentro da visualização que você deseja trazer para o topo ... (em rápido)
superview?.bringSubviewToFront(self)
Se você estiver usando o cocos2d, poderá ver um problema com [parentView bringSubviewToFront: view], pelo menos não estava funcionando para mim. Em vez de trazer a vista que eu queria para a frente, eu envio as outras vistas de volta, e isso fez o truque.
[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)];
Podemos usar o zPosition no ios
se tivermos uma visualização denominada salonDetailView,
por exemplo:@IBOutlet weak var salonDetailView: UIView!
e tenha o UIView for GMSMapView,
por exemplo:@IBOutlet weak var mapViewUI: GMSMapView!
Para mostrar o View salonDetailView na parte superior do mapViewUI
use zPosition como abaixo
salonDetailView.layer.zPosition = 1