7

Se sabe que zPosition de las capas solo determina qué capa cubre la capa. Si es un zPosition de 10 o 1000 no afectará su posición.En iOS, ¿por qué la configuración de la capa sublayerTransform se convierte en sí misma para actuar como CATranformLayer?

Es decir, a menos que tengamos use CATransformLayer to contain those layers, entonces el zPosition de esas capas afectará la posición de las capas.

Sin embargo, el siguiente código que se ejecuta en iOS 5.1.1 hace que el zPosition modifique la posición de las capas ... puede probarlo en una nueva aplicación de vista única y agregar el siguiente código a ViewController.m. Si el zPosition de layer2 se cambia de 88 a 188, podemos ver que la capa se mueve en consecuencia. Entonces, no hay CATransformLayer en el código; ¿Por qué se comportará así? (Por favor, cita los documentos de Apple o cualquier referencia).

También se relaciona, si la línea self.view.layer.sublayerTransform = transform3D; se cambia a self.view.layer.transform = transform3D; entonces el zPosition no tendrá ningún efecto en la posición. Pero according to the Apple docs, transform and sublayerTransform only differ in whether self is transformed or not:

Dos propiedades de capa especifican transformar las matrices: transform y sublayerTransform. La matriz especificada por transform property es aplicada a la capa y sus subcapas en relación con la capa anchorPoint. [...] La matriz especificada por la propiedad sublayerTransform se aplica solo a las subcapas de la capa, en lugar de a la propia capa.

Por lo tanto, es extraño que cambiar eso ocasione que self.view.layer actúe como 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];  

} 

Respuesta

0

podemos pensar en la capa como una capa de coordenadas, cuando hacemos una transfrom3D capa, que coordine convertido en 3D, pero su subcapa todavía muestran como 2D, pero cuando se establece transfrom3D subcapa, la capa hará que su todo subcapa mostrar como 3D.it es lo mismo que la rotación

1

Para comprender realmente la diferencia entre las propiedades de una capa transform y sublayerTransform, creo que es útil pensar en esto en términos de mirar un televisor con contenido 3D. Consulte my modified version of your code in Swift playground.

Aquí está la versión inicial: usted tiene un televisor con contenido que consiste en ninguna transformación de perspectiva de ningún tipo. Por lo tanto, su contenido (las dos subcapas naranja y amarilla) se ve plano incluso con rotación alrededor del eje y. Más o menos lo que esperarías de una proyección ortográfica.

.none option

Sin embargo, si se mantiene el televisor todavía, pero transformar su contenido por debajo con proyección en perspectiva, ahora se ve inmediatamente la profundidad de su contenido. El zPosition de las subcapas que ha agregado realmente juegan un papel importante para darle una sensación de profundidad, y es correcto por its definition. Así es exactamente como funciona sublayerTransform: transforma solo los contenidos, pero no el televisor en sí.

.sublayerTransform option

Ahora, ¿qué aspecto tendría si uso transform en lugar de sublayerTranform? Imagine que no sólo la transformación de los contenidos, sin que gire toda la de televisión junto con los contenidos adjuntos a la pantalla, y que vería el resultado esperado:

.transform option

Así que, sí, al parecer transform y se comportan sublayerTransform bastante diferente cuando se trata de tratar zPosition de las subcapas, aunque the documentation doesn't explicitly say so. El zPosition de una subcapa no tiene ningún efecto en el transform de su matriz, pero sí proporciona un efecto 3D normal en el sublayerTransform de su matriz.

Cuestiones relacionadas