Existe-t-il un moyen de définir une sorte d'index z pour la position z des objets UIImageView?

StackOverflow https://stackoverflow.com/questions/826068

Question

Je construis une grille d’images et je commence par le haut, en créant des objets UIImageView un peu partout. Maintenant, je veux qu'ils se chevauchent un peu, mais les derniers que je dessine sont ceux qui arrivent en tête. J'aimerais définir la position z par programmation, afin que les premiers que je dessine soient ceux qui se trouvent le plus haut.

Était-ce utile?

La solution

Vous avez dit avoir utilisé UIImageView. Dessiner une image avec UIImageView signifie l’initialiser puis l’ajouter à une vue conteneur.

Ne pouvez-vous pas simplement utiliser ce code dans votre boucle?

[containerView insertSubview:image atIndex:[[containerView subviews] count]]

Le résultat serait que la vue ajoutée en premier se trouve en haut de la pile de vues (je n'ai pas encore pu tester cela :))

Autres conseils

au lieu d'utiliser insertSubiew , vous pouvez essayer:

- (void)bringSubviewToFront:(UIView *)view
- (void)sendSubviewToBack:(UIView *)view

https://stackoverflow.com/a/4631895/2482283

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 l'a ajouté Viktor Nordling, "les grandes valeurs sont au top. Vous pouvez utiliser les valeurs de votre choix, y compris les valeurs négatives. & Quot; La valeur par défaut est 0.

Vous devez importer la structure QuartzCore pour accéder à la couche. Ajoutez simplement cette ligne de code en haut de votre fichier d’implémentation.

#import "QuartzCore/QuartzCore.h"

autrement ( https://stackoverflow.com/a/4663526/2482283 ), vous pouvez également utiliser uiviews méthode:

@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;

Pas directement.

Une solution serait de donner à UIViews une propriété z-index; un entier définissant votre niveau de profondeur. Ensuite, vous pouvez parcourir un NSArray (myArray) contenant les UIViews en les ajoutant en tant que sous-vues par ordre de profondeur.

J'ai eu le même problème. J'avais besoin de l'élément de sous-vue avec l'indice z le plus élevé et le plus bas. D'après mes tests, j'ai découvert que UIKit organise les éléments dans la propriété subviews en fonction de leur position z. Si vous prenez [sous-vues de self.scrollview] par exemple. Le premier élément du tableau est la sous-vue qui se trouve tout à fait en arrière. L'élément de tableau avec l'indice le plus élevé est la sous-vue au tout premier plan. Si vous utilisez

- (void)bringSubviewToFront:(UIView *)view
- (void)sendSubviewToBack:(UIView *)view`

le tableau de sous-vues sera réorganisé en conséquence.

Si vous avez la référence à la vue ci-dessous / ci-dessus, vous devez ajouter la vue secondaire, vous pouvez utiliser ce qui suit

[self.view insertSubview:<#(UIView *)#> belowSubview:<#(UIView *)#>];
[self.view insertSubview:<#(UIView *)#> aboveSubview:<#(UIView *)#>];

En fait, pour autant que je sache, il n’existe pas de propriété de position z-index pour cela. Le dessin dans la vue utilise un modèle de dessin simple.

Vous pouvez soit mettre votre logique dans la boucle de dessin (c.-à-d. dessiner ce que vous voulez en dernier), soit utiliser Cocoa Animation, car contrairement à UIImageView, les CALayers ont une profondeur (ils sont une projection 2D d'un espace 3D). . Voir pour une référence.

Vous voudrez peut-être envisager d’utiliser CALayer plutôt que de nombreux objets UIImageView. Les objets UIImageView sont excellents, mais pour les dessins intenses, ceux de CALayer sont plus légers et plus efficaces (cependant, si vous devez faire interagir un utilisateur avec les images, un objet de vue est préférable). Cela dépend vraiment de ce que vous faites. Les CALayers ont une propriété zPosition. C’est ce que UIKit utilise pour organiser la position de UIView dans la pile de vues.

imageView.layer.zPosition = 100;
scroll top