7

È noto che lo zPosition dei livelli determina solo il livello che copre il livello. Se si tratta di un zPosition di 10 o 1000 non influenzerà la sua posizione.Su iOS, perché l'impostazione di un sottostratoTrasforma di un livello si trasforma da solo a CATranformLayer?

Cioè, a meno che se si sia use CATransformLayer to contain those layers, quindi il zPosition di tali livelli influenzerà la posizione dei livelli.

Tuttavia, il codice seguente in esecuzione su iOS 5.1.1 rende lo zPosition alterare la posizione dei livelli ... è possibile provarlo in una nuova app Single View e aggiungere il codice seguente a ViewController.m. Se lo zPosition di layer2 viene modificato da 88 a 188, possiamo vedere che il livello si sposta di conseguenza. Quindi no CATransformLayer è nel codice; perché si comporterà così? (Si prega di citare i documenti Apple o qualsiasi riferimento).

Anche correlato è, se la riga self.view.layer.sublayerTransform = transform3D; è stata modificata in self.view.layer.transform = transform3D; quindi il zPosition non avrà alcun effetto sulla posizione. Ma according to the Apple docs, transform and sublayerTransform only differ in whether self is transformed or not:

Due proprietà del livello specificano trasformare matrici: transform e sublayerTransform. La matrice specificata da transform property è applicata al livello e ai relativi sottolivelli in relazione allo anchorPoint. [...] La matrice specificata dalla proprietà sublayerTransform si applica solo ai sottolivelli del livello, anziché al livello stesso.

Quindi è strano che il motivo per cui il cambiamento causerà self.view.layer come un CATransformLayer.

-(void) viewDidAppear:(BOOL)animated { 

    CATransform3D transform3D = CATransform3DIdentity; 

    transform3D.m34 = -1.0/1000; 

    transform3D = CATransform3DRotate(transform3D, M_PI/4, 0, 1, 0); 

    self.view.layer.sublayerTransform = transform3D; 

    CALayer *layer1 = [[CALayer alloc] init]; 
    layer1.zPosition = 33; 
    layer1.frame = CGRectMake(100, 100, 100, 100); 
    layer1.backgroundColor = [[UIColor orangeColor] CGColor]; 

    [self.view.layer addSublayer:layer1]; 

    CALayer *layer2 = [[CALayer alloc] init]; 
    layer2.zPosition = 88; 
    layer2.frame = CGRectMake(100, 120, 100, 100); 
    layer2.backgroundColor = [[UIColor yellowColor] CGColor]; 

    [self.view.layer addSublayer:layer2];  

} 

risposta

0

possiamo pensare che il livello come livello di coordinate, quando facciamo un transfrom3D strato, è coordinare diventare 3D, ma la sua sottolivello mostrano ancora come in 2D, ma se impostato sottolivello transfrom3D, lo strato farà il suo tutto sottolivello mostra come 3D.it è la stessa della rotazione

1

Per capire veramente la differenza tra un livello transform e sublayerTransform proprietà, penso che sia utile pensarlo in termini di guardare una TV con contenuti 3D in esso. Controlla my modified version of your code in Swift playground.

Ecco la versione iniziale: si dispone di una TV con contenuti che non prevedono alcuna trasformazione della prospettiva. Pertanto, il contenuto (i due sottolivelli arancione e giallo) appare piatto anche con la rotazione attorno all'asse y. Praticamente quello che ti aspetteresti per una proiezione ortografica.

.none option

Tuttavia, se si tiene il televisore ancora, ma trasformare il suo sito web sotto con proiezione prospettica, ora si vede subito la profondità dei tuoi contenuti. Il zPosition dei sottolivelli che hai aggiunto gioca davvero un ruolo importante nel darti un senso di profondità, ed è giusto che sia così da its definition. Questo è esattamente il modo in cui funziona sublayerTransform: trasforma solo il contenuto, ma non il televisore stesso.

.sublayerTransform option

Ora, che cosa sarebbe simile se uso transform invece di sublayerTranform? Immagina di non trasformare solo il contenuto, ma ruotare l'intero TV insieme con i contenuti attaccati allo schermo, e che ci si vede il risultato atteso:

.transform option

Quindi, sì, a quanto pare transform e sublayerTransform si comportano abbastanza diversamente quando si tratta di trattare lo zPosition dei sottolivelli, sebbene the documentation doesn't explicitly say so. Il sottotitolo zPosition non ha alcun effetto su quello del genitore transform, ma fornisce un normale effetto 3D su quello del genitore sublayerTransform.

Problemi correlati