Deshabilitar animation al cambiar las properties de capa / vista?

Compuse un tipo de animation agregando varias capas a una UIView. Esas capas deben ser visibles o invisibles mediante un script.

El script se basa en objects que implementan un protocolo:

// the general protocol for a step @protocol ActionStep -(void) applyForTime:(int)playtime; -(void) reset; @end 

y en un timer he iterado a través de los objects de paso:

 NSEnumerator* enumerator = [ScriptObjects objectEnumerator]; id obj; while ( obj = [enumerator nextObject] ) { id <ActionStep> step = obj; [step applyForTime:currentmilliseconds]; } 

Un object de script es este object:

 @interface LayerStep : NSObject <ActionStep> { int mTimeOffset; CGPoint mOffset; float mAlpha; LayerObject* mTheLayer; bool mPrepanetworking; } -(id)initWithLayerObject: (LayerObject*) theLayer Milliseconds:(int) milliseconds Offset:(CGPoint) offset Alpha:(float)alpha; @end 

y finalmente implemento el protocolo en la capa:

 -(void) applyForTime:(int)playtime { if ( mPrepanetworking ) // has the step already been executed? { if ( playtime >= mTimeOffset ) { [mTheLayer setAlpha:mAlpha]; // AssignedLayer.opacity = alpha; [mTheLayer setPosition:mOffset]; // AssignedLayer.position = offset; mPrepanetworking = false; } } } 

Al aplicar los cambios en el paso, se produce una transición.

¿Hay alguna forma de deshabilitar esta transición? No estoy usando ninguna llamada de CoreAnimation en este momento, solo las properties en sí (ver código).

Cambiar una de las properties "animables" de una capa crea lo que los documentos de Apple llaman una animation implícita.

Para citar los documentos de Xcode sobre el tema:

El model de animation implícito de Core Animation asume que todos los cambios a las properties de capa animables deberían ser graduales y asíncronos. Las escenas animadas dinámicamente se pueden lograr sin animar explícitamente las capas. Al cambiar el valor de una propiedad de capa animable, la capa anima implícitamente el cambio del valor antiguo al nuevo valor. Mientras que una animation está en vuelo, establecer un nuevo valor de destino provoca que la animation haga una transición al nuevo valor objective desde su estado actual.

Bajo las cubiertas, el sistema genera una CAAnimation que hace el cambio.

Como dijo el otro póster, puedes usar setAnimationDuration para que la animation ocurra en un instante, lo que tiene el efecto de desactivar las animaciones. Sospecho que el sistema sigue generando una animation.

La forma oficial de desactivar las animaciones de capas implícitas es usar

 [CATransaction begin]; [CATransaction setDisableActions: YES]; //layer changes [CATransaction commit]; 

Editar:

En Swift 3, este código se vería así:

 CATransaction.begin() CATransaction.setDisableActions(true) //layer changes CATransaction.commit() 

Simplemente envuelve el código donde estás haciendo el cambio.

 [CATransaction begin]; [CATransaction setAnimationDuration:0]; [thelayer setAlpha:0]; [CATransaction commit];