¿Cuándo ocurren exactamente las animaciones implícitas en iOS?

Todos y cada libro afirman que hay animaciones implícitas en CALayer. Sin embargo, cada vez que quería verificar que hasta ahora, termino con un ajuste directo al valor establecido. Sin animation en absoluto.

Aquí hay un ejemplo en un proyecto donde no ocurre nada más. Todo lo que hago es crear una vista, luego get su instancia de CALayer y hacer algo que debería estar implícitamente animado.

[theLayer setValue:[NSNumber numberWithFloat:M_PI * 1.1] forKeyPath:@"transform.rotation.z"]; 

Otro:

 CGRect currentBounds = theLayer.bounds; currentBounds.size.width += 120.f; [self.animatedLayer setBounds:currentBounds]; 

La vista contiene algunas cosas, por supuesto, para que pueda ver el cambio. Veo el cambio visual, pero como un golpe fuerte. Sin animation en absoluto.

Así que todos esos libros están mal y tienen en count el viejo conocimiento de Mac OS X al escribir sobre Core Animation y animaciones implícitas, o estoy haciendo algo mal. ¿Alguien puede proporcionar un ejemplo práctico que muestre animaciones implícitas en el iPhone?

UIKit deshabilita las animaciones implícitas. Para ser más específico, un CALayer asociado con una UIView nunca animará implícitamente. CALayers que usted crea y que no están asociados con una UIView comprará en la maquinaria de animation implícita normal.

Si estás interesado en cómo funciona esto, las animaciones implícitas ocurren después de la normal -actionForKey: búsqueda. Si hay una CAAction para una propiedad dada, se utiliza. De lo contrario, se utiliza la animation implícita. En el caso de un CALayer asociado con una UIView, UIView implementa el -actionForLayer:forKey: delegate, y cuando no está en un bloque de animation UIView, siempre devuelve [NSNull null] para indicar que la búsqueda de acción debería detenerse aquí. Esto evita que las animaciones implícitas funcionen. Dentro de un bloque de animation UIView, construye su propia acción para representar la configuration actual de animation de UIView. Nuevamente, esto evita animaciones implícitas.

Si necesita animar las properties de CALayer que UIView no hará por usted, puede usar una subclass CAAnimation explícita (como CABasicAnimation).

Publicación anterior, pero el enlace a continuación apunta a una sección en la Guía de progtwigción de animation principal que ayuda a arrojar algo más de luz sobre lo que Kevin Ballard estaba diciendo. Realmente debe haber una nota descarada que mencione que para animar las properties de la capa subyacente de UIView debe asegurarse de establecer el delegado de la capa en una instancia que adoptará el método "actionForLayer: ForKey:" y devolverá nil. Se ha descubierto que también puede establecer el delegado en una instancia que no adopta este método y que aún permite animaciones implícitas, pero esta es una práctica descuidada y confusa.

Core Animation – Acciones de capa – Patrón de búsqueda definido para las keys de acción

Tenga en count que las subcapas de la capa primaria de UIView normalmente no tienen UIView como su delegado. Por lo tanto, participan en la animation implícita a less que lo bloquee explícitamente, incluso si no ha proporcionado un delegado para devolver una acción nula en respuesta a actionForLayer: forKey :.

Entonces, una forma simple de get animation implícita en una vista genérica es simplemente agregar una subcapa que cubra la capa primaria.

El libro de Matt Neuberg Programming iOS 5 (actualmente en versión beta en Safari Books Online) explica este tema muy lúcidamente.

Es exactamente la respuesta correcta de Kevin Ballard. Quiero proporcionar algo más aquí.

La información detallada del documento oficial

Hay una sección llamada: Reglas para modificar capas en iOS, y encontrarás

La class UIView deshabilita las animaciones de capas de forma pnetworkingeterminada, pero las vuelve a activar dentro de los bloques de animation.

Excepto habilitar lo implícito en el bloque de animation UIView. Hay dos otra solución:

  1. Haz la capa que necesitas para animar una subcapa de una vista. Consulte la [respuesta] [2]

    [2]: Las animaciones de propiedad implícitas no funcionan con CAReplicatorLayer? de Fade-in de animation implícita no funciona. Intenté esto, funcionó como esperaba.

  2. Asigne el delegado de la capa a la capa misma. El delegado pnetworkingeterminado de la capa en iOS es su vista de almacén de respaldo que implementa la key actionForLayer: (id) paraKey: (NSString *) y devuelve [NSNull null] para deshabilitar la animation implícita de la capa.

También puede establecer el delegado de la capa en su propio object y manejar -actionForLayer: forKey :. Parece que obtienes animation implícita incluso si el delegado no implementa -actionForLayer: forKey :.

en realidad, podrías devolver nil para get la animation pnetworkingeterminada de CALay.

  • (id) actionForLayer: (CALayer *) layer forKey: (NSString *) event {return nil; }