web-dev-qa-db-fra.com

Comment définir l'index iPhone UIView pour iPhone?

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?

242
Tattat

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.

276
Nathan Eror

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"
320
Daniel Pendergast

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,

views - red view on top

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

views - green view on top

Dans Interface Builder

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.

order of views in Interface Builder

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

En rapide

Il existe différentes manières de procéder par programme.

Méthode 1

yellowView.bringSubviewToFront(greenView)
  • Cette méthode est l'équivalent programmatique de la réponse de l'IB ci-dessus.
  • Cela ne fonctionne que si les sous-vues sont des frères et soeurs les uns des autres.
  • 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
  • Cette méthode déplace simplement la position 3D du calque plus haut (plus proche de l'utilisateur) sur l'axe des z. Étant donné que la valeur par défaut est 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.
  • La zPosition peut être définie sur CGFloat.greatestFiniteMagnitude (CGFloat(FLT_MAX) dans les versions antérieures de Swift) pour garantir sa place.
92
Suragch
[parentView bringSubviewToFront:view] ;
74
Kolin Krewinkel

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.

19
larspars

Dans la vue que vous souhaitez amener au sommet ... (dans Swift)

superview?.bringSubviewToFront(self)
9
Carter Medlin

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)]; 
4
Madhav Sbss

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 mapViewUI

utilise zPosition comme ci-dessous

salonDetailView.layer.zPosition = 1
1
abhijith k