¿Cómo aplico una transformación de perspectiva a una UIView?

Estoy buscando realizar una transformación de perspectiva en una UIView (como se ve en coverflow)

¿Alguien sabe si esto es posible?

He investigado el uso de CALayer y he CALayer todos los pragmáticos podcasts de Core Animation, pero aún no estoy más claro sobre cómo crear este tipo de transformación en un iPhone.

Cualquier ayuda, pointers o fragments de código de ejemplo sería muy apreciada!

Como dijo Ben, deberás trabajar con la capa de UIView, usando un CATransform3D para realizar la rotation de la capa. El truco para lograr que la perspectiva funcione, como se describe aquí , es acceder directamente a una de las células de la matriz de CATransform3D (m34). Matrix math nunca ha sido lo mío, así que no puedo explicar exactamente por qué esto funciona, pero lo hace. Tendrá que establecer este valor en una fracción negativa para su transformación inicial, luego aplique sus transformaciones de rotation de capa a eso. También debe poder hacer lo siguiente:

 UIView *myView = [[self subviews] objectAtIndex:0]; CALayer *layer = myView.layer; CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity; rotationAndPerspectiveTransform.m34 = 1.0 / -500; rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 45.0f * M_PI / 180.0f, 0.0f, 1.0f, 0.0f); layer.transform = rotationAndPerspectiveTransform; 

que reconstruye la transformación de capa desde cero para cada rotation.

Un ejemplo completo de esto (con código) se puede encontrar aquí , donde he implementado la rotation basada en el tacto y la escala en un par de CALayers, en base a un ejemplo de Bill Dudney. La versión más reciente del progtwig, en la parte inferior de la página, implementa este tipo de operación de perspectiva. El código debe ser razonablemente simple de leer.

La subcapaTransform a la que se refiere en su respuesta es una transformación que se aplica a las subcapas de su CALayer de CALayer . Si no tiene subcapas, no se preocupe por eso. Utilizo la subcapaTransform en mi ejemplo simplemente porque hay dos CALayers contenidos dentro de la capa que estoy rotando.

Un artículo muy, muy bueno sobre la transformación y la perspectiva de CALayer 3D, que incluye una explicación exhaustiva del campo m34, se puede encontrar en este excelente artículo:

core-animation-3d-model

Solo puede usar las transformaciones de Core Graphics (Quartz, 2D solamente) aplicadas directamente a la propiedad de transformación de UIView. Para get los efectos en el flujo de cobertura, deberá usar CATransform3D, que se aplica en el espacio en 3-D, y así puede darle la vista en perspectiva que desee. Solo puedes aplicar CATransform3Ds a las capas, no a las vistas, por lo que tendrás que cambiar a capas para esto.

Echa un vistazo a la muestra "CovertFlow" que viene con Xcode. Es mac-only (es decir, no para iPhone), pero muchos de los conceptos se transfieren bien.

Para agregar a la respuesta de Brad y proporcionar un ejemplo concreto, tomo prestado de mi propia respuesta en otra publicación sobre un tema similar. En mi respuesta, creé un patio de juegos simple Swift con el que puedes download y jugar , donde demostré cómo crear efectos de perspectiva de una UIView con una simple jerarquía de capas, y muestro diferentes resultados entre usar transform y sublayerTransform . Echale un vistazo.

Aquí hay algunas de las imágenes de la publicación:

opción .sublayerTransform

opción de transformación