Je souhaite déplacer une vue sur une autre, comment puis-je connaître l'index z de la vue et comment passer en haut?
UIView
les frères et sœurs sont empilés dans l'ordre dans lequel ils ont été ajoutés à leur vue d'ensemble. Les méthodes et propriétés de la hiérarchie UIView
permettent de 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 classées dans le tableau subviews
. La vue la plus haute sera donc:
[parentView.subviews lastObject];
et la vue de dessous sera:
[parentView.subviews objectAtIndex:0];
Comme Kolin Krewinkel l'a dit, [parentView bringSubviewToFront:view]
amènera la vue au sommet, mais ce n'est le cas que si les vues sont toutes des frères et soeurs dans la hiérarchie.
Vous pouvez utiliser la propriété zPosition
du calque de la vue (c'est un objet CALayer
) pour modifier l'index z de la vue.
theView.layer.zPosition = 1;
Comme Viktor Nordling ajouté, "les grandes valeurs sont en haut. Vous pouvez utiliser toutes les valeurs de votre choix, y compris les valeurs négatives". La valeur par défaut est 0.
Vous devez importer le cadre QuartzCore pour accéder à la couche. Ajoutez simplement cette ligne de code en haut de votre fichier d'implémentation.
#import "QuartzCore/QuartzCore.h"
IB et Swift
Compte tenu de la disposition fluide où jaune est la super vue et rouge, vert et bleu sont sous-vues frères de jaune,
l'objectif est de déplacer une sous-vue (disons verte) vers le haut.
Dans le Générateur d'interface, tout ce que vous avez à faire est de faire glisser la vue que vous souhaitez afficher en haut de la liste, dans le bas de la liste des documents.
Vous pouvez également sélectionner la vue, puis dans le menu, accédez à Editeur> Organiser> Envoyer au premier plan .
Il existe différentes manières de procéder par programme.
Méthode 1
yellowView.bringSubviewToFront(greenView)
Un tableau des sous-vues est contenu dans yellowView.subviews
. Ici, bringSubviewToFront
déplace la greenView
de l'index 0
vers 2
. Ceci peut être observé avec
print(yellowView.subviews.indexOf(greenView))
Méthode 2
greenView.layer.zPosition = 1
0
pour toutes les autres vues, il en résulte que la greenView
semble être au-dessus. Cependant, il reste toujours à l'index 0
du tableau yellowView.subviews
. Cela peut toutefois entraîner des résultats inattendus, car des événements tels que les événements de tap vont toujours aller en premier à la vue avec le numéro d'index le plus élevé. Pour cette raison, il serait peut-être préférable d’utiliser la méthode 1 ci-dessus.zPosition
peut être définie sur CGFloat.greatestFiniteMagnitude
(CGFloat(FLT_MAX)
dans les versions antérieures de Swift) pour garantir sa place.[parentView bringSubviewToFront:view] ;
Si vous souhaitez le faire via Interface Builder de XCode, vous pouvez utiliser les options de menu sous Editeur-> Arrangement. Vous y trouverez "Envoyer à l'avant", "Envoyer à l'arrière", etc.
Dans la vue que vous souhaitez amener au sommet ... (dans Swift)
superview?.bringSubviewToFront(self)
Si vous utilisez cocos2d, vous pouvez rencontrer un problème avec [parentView bringSubviewToFront: view], du moins, cela ne fonctionnait pas pour moi. Au lieu d’apporter la vue que je voulais au premier plan, j’envoie les autres vues en retour et c’est tout.
[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)];
Nous pouvons utiliser zPosition dans iOS
si nous avons une vue nommée salonDetailView , par exemple: @IBOutlet weak var salonDetailView: UIView!
et avoir UIView pour GMSMapView , par exemple: @IBOutlet weak var mapViewUI: GMSMapView!
Pour afficher la vue salonDetailView en haut de mapViewUI
utilise zPosition comme ci-dessous
salonDetailView.layer.zPosition = 1