Esiste un modo per impostare una sorta di indice z per la posizione z degli oggetti UIImageView?

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

Domanda

Sto costruendo una griglia di immagini e inizio dall'alto, creando oggetti UIImageView dappertutto. Ora voglio che si sovrappongano un po ', ma gli ultimi che disegno sono quelli più in cima. Vorrei impostare la posizione z a livello di codice, in modo che i primi che disegno siano quelli più in cima.

È stato utile?

Soluzione

Hai detto di aver usato UIImageView. Disegnare un'immagine con UIImageView significa inizializzarla e quindi aggiungerla a una vista contenitore.

Non puoi semplicemente usare questo codice nel tuo ciclo?

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

Il risultato sarebbe che la vista aggiunta per prima si trova nella parte superiore dello stack della vista (non sono ancora stata in grado di testarla :))

Altri suggerimenti

invece di utilizzare insertSubiew puoi provare:

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

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

È possibile utilizzare la proprietà zPosition del livello della vista (è un oggetto CALayer) per modificare l'indice z della vista.

theView.layer.zPosition = 1;

Come ha aggiunto Viktor Nordling, "i grandi valori sono in cima. Puoi utilizzare tutti i valori desiderati, compresi i valori negativi. & Quot; Il valore predefinito è 0.

È necessario importare il framework QuartzCore per accedere al layer. Aggiungi questa riga di codice nella parte superiore del file di implementazione.

#import "QuartzCore/QuartzCore.h"

in un altro modo ( https://stackoverflow.com/a/4663526/2482283 ), puoi anche utilizzare le uiviste metodo:

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

Non direttamente.

Una soluzione sarebbe quella di dare agli UIVview una proprietà z-index; un numero intero che definisce il livello di profondità. Quindi è possibile scorrere un NSArray (myArray) contenente le UIVview aggiungendole come sottoview in ordine di profondità.

Ho avuto lo stesso problema. Avevo bisogno dell'elemento subview con l'indice z più alto e più basso. Dai miei test ho scoperto che UIKit organizza gli elementi nella proprietà subviews in base alla loro posizione z. Se prendi [self.scrollview subviews] per esempio. Il primo elemento dell'array è la sottoview che si trova in fondo. L'elemento array con l'indice più alto è la sottoview in primo piano. Se usi

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

l'array delle visualizzazioni secondarie verrà riordinato di conseguenza.

Se hai il riferimento alla vista sotto / sopra devi aggiungere la vista secondaria puoi usare il seguente

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

In realtà, per quanto ne so, non esiste una proprietà position z-index per questo. Il disegno nella vista utilizza un semplice modello di disegno.

Puoi mettere la tua logica nel loop di disegno (ovvero disegnare le cose che vuoi per ultimo) oppure puoi usare Cocoa Animation, poiché a differenza di UIImageView, i CALayer hanno profondità (sono una proiezione 2D di uno spazio 3D) . Vedi qui per riferimento.

Potresti davvero prendere in considerazione l'uso di CALayer invece di molti oggetti UIImageView. Gli oggetti UIImageView sono fantastici, ma per un disegno intenso i CALayer sono più leggeri e più efficienti (anche se è necessario che un utente interagisca con le immagini, un oggetto vista è migliore). Dipende davvero da cosa stai facendo. I CALayer hanno una proprietà zPosition. Questo è ciò che UIKit utilizza quando organizza la posizione di UIView nello stack di visualizzazione.

imageView.layer.zPosition = 100;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top