Comment configurer l'index iPhone UIView z?

252

Je souhaite déplacer une vue au-dessus d'une autre, comment puis-je connaître l'index z de la vue et comment passer au sommet?

Tattat
la source

Réponses:

279

UIViewles frères et sœurs sont empilés dans l'ordre dans lequel ils sont ajoutés à leur vue d'ensemble. Les UIViewméthodes et propriétés de hiérarchie sont là pour gérer l'ordre des vues. Dans 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;

Les vues frères sont ordonnées de l'arrière vers l'avant dans le subviewstableau. La vue la plus haute sera donc:

[parentView.subviews lastObject];

et la vue de dessous sera:

[parentView.subviews objectAtIndex:0];

Comme l'a dit Kolin Krewinkel, [parentView bringSubviewToFront:view]cela amènera la vue au sommet, mais ce n'est le cas que si les vues sont toutes des frères et sœurs de la hiérarchie.

Nathan Eror
la source
329

Vous pouvez utiliser la zPositionpropriété du calque de la vue (c'est un CALayerobjet) pour modifier le z-index de la vue.

theView.layer.zPosition = 1;

Comme l'a ajouté Viktor Nordling , "les grandes valeurs sont au top. Vous pouvez utiliser toutes les valeurs que vous voulez, y compris les valeurs négatives." La valeur par défaut est 0.

Vous devez importer le framework QuartzCore pour accéder au calque. Ajoutez simplement cette ligne de code en haut de votre fichier d'implémentation.

#import "QuartzCore/QuartzCore.h"
Daniel dit réintégrer Monica
la source
7
Tout comme une aide, les grandes valeurs sont "au top". Vous pouvez utiliser toutes les valeurs souhaitées, y compris les valeurs négatives.
Viktor Nordling
12
Cette solution est meilleure si vous souhaitez que votre vue soit toujours au top. Définissez simplement zPosition sur MAXFLOAT
Muhammad Hassan Nasr
27
Je viens d'apprendre que la zPosition de la couche et le gestionnaire d'entrée de UIView sont sur deux ordres Z différents. C'est vraiment étrange quand vos clics "passent"
Stephen J
la vue d'ensemble des vues doit-elle être la même pour que les zPositionœuvres fonctionnent?
Hlung
3
J'ai remarqué que, même si la vue est en haut, des clics la traversent vers les objets en dessous. Cela devrait être considéré comme un bug. J'essaie de trouver un moyen général d'éviter ce problème, sans avoir à désactiver explicitement les interactions utilisateur des vues qui se trouvent en dessous.
Bruce Patin
103

IB et Swift

Étant donné la disposition fluide où le jaune est la vue d'ensemble et le rouge, le vert et le bleu sont des sous-vues frères du jaune,

vues - vue rouge en haut

l'objectif est de déplacer une sous-vue (disons verte) vers le haut.

vues - vue verte en haut

Dans Interface Builder

Dans l'Interface Builder, il vous suffit de faire glisser la vue que vous souhaitez afficher du haut vers le bas de la liste dans le plan des documents.

ordre des vues dans Interface Builder

Vous pouvez également sélectionner la vue, puis dans le menu, accédez à Editeur> Réorganiser> Envoyer au premier plan .

Dans Swift

Il existe plusieurs façons de procéder par programmation.

Méthode 1

yellowView.bringSubviewToFront(greenView)
  • Cette méthode est l'équivalent programmatique de la réponse IB ci-dessus.

  • Cela ne fonctionne que si les sous-vues sont des frères et sœurs les uns des autres.

  • Un tableau des sous-vues est contenu dans yellowView.subviews. Ici, bringSubviewToFrontdéplace l' greenViewindex de 0vers 2. Cela peut être observé avec

      print(yellowView.subviews.indexOf(greenView))

Méthode 2

greenView.layer.zPosition = 1
  • Cette méthode déplace simplement la position 3D du calque plus haut (plus près de l'utilisateur) sur l'axe z. Étant donné que la valeur par défaut est 0pour toutes les autres vues, le résultat est que l' greenViewapparence est en haut. Cependant, il reste toujours à l'index 0du yellowView.subviewstableau. Cependant, cela peut entraîner des résultats inattendus, car des éléments tels que les événements tap iront toujours en premier à la vue avec le numéro d'index le plus élevé. Pour cette raison, il pourrait être préférable d'utiliser la méthode 1 ci-dessus.
  • Le zPositionpourrait être défini sur CGFloat.greatestFiniteMagnitude( CGFloat(FLT_MAX)dans les anciennes versions de Swift) pour s'assurer qu'il est au top.
Suragch
la source
merci pour cela ... j'ai passé 8 heures à essayer de comprendre cela. yellowView.bringSubviewToFront (greenView) a parfaitement fonctionné.
MizAkita
Fait intéressant, les vues de conteneurs ne respectent pas cela! Vous devez les déplacer manuellement dans le code, semble-t-il.
Fattie
75
[parentView bringSubviewToFront:view] ;
Kolin Krewinkel
la source
19

Si vous souhaitez le faire via Interface Builder de XCode, vous pouvez utiliser les options de menu sous Editeur-> Arrangement. Vous y trouverez "Envoyer vers l'avant", "Envoyer vers l'arrière", etc.

larspars
la source
Que faire si les options d'Arrangement sont désactivées?
mr5
9

Dans la vue que vous souhaitez mettre en haut ... (en rapide)

superview?.bringSubviewToFront(self)
Carter Medlin
la source
btnDOWN.superview? .bringSubview (toFront: btnDOWN)
Criss
4

Si vous utilisez cocos2d, vous pouvez voir un problème avec [parentView bringSubviewToFront: view], au moins cela ne fonctionnait pas pour moi. Au lieu de mettre la vue que je voulais au premier plan, je renvoie les autres vues et cela a fait l'affaire.

[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)]; 
Madhav Sbss
la source
2

Nous pouvons utiliser zPosition dans ios

si nous avons une vue nommée salonDetailView, par exemple:@IBOutlet weak var salonDetailView: UIView!

Dans mon cas voir l'image

et avoir UIView pour GMSMapView, par exemple:@IBOutlet weak var mapViewUI: GMSMapView!

Pour afficher la vue salonDetailView en haut de la carteViewUI

utilisez zPosition comme ci-dessous

salonDetailView.layer.zPosition = 1
abhijith k
la source
veuillez poster des photos et du code directement ici dans votre réponse, pour que OP puisse les obtenir plus facilement.
skratchi.at
en tant que débutant, StackOverflow ne me permettra pas de le faire désolé. vous pouvez vérifier l'image du problème i.stack.imgur.com/d9Cx3.png
abhijith k
0

Ou utilisez ceci

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

selon ici

Peter
la source