ios animation calayer

ios - ¿Cómo deshabilitar las animaciones implícitas de CALayer?



animation (6)

¡Me esta volviendo loco! Estoy trabajando en una aplicación de dibujo. Digamos que estoy trabajando en una hoja llamada UIView .

Estoy agregando algunas subcapas a esta vista ( [sheet.layer addSublayer:...] ) y luego deseo dibujar en ellas. Para hacerlo, estoy creando un CGImageRef y poniéndolo en los contents la capa. Pero está animado y no quiero eso.

Intenté todo:

  • removeAnimationForKey:
  • removeAllAnimations
  • establecer el diccionario de acciones
  • usando el delegate la capa de acción
  • [CATransaction setDisableAnimations:YES]

Parece correcto. No entiendo por qué esta capa todavía está animada; _;
¿Estoy haciendo algo mal? ¿Hay una manera secreta?


Código global reutilizable:

/** * Disable Implicit animation * EXAMPLE: disableAnim{view.layer?.position = 20}//Default animation is now disabled */ func disableAnim(_ closure:()->Void){ CATransaction.begin() CATransaction.setDisableActions(true) closure() CATransaction.commit() }

Agregue este código en cualquier lugar de su código (Ámbito global)


A partir de Mac OS X 10.6 y iOS 3, CATransaction también tiene un método setDisableActions que establece el valor de la clave kCATransactionDisableActions .

[CATransaction begin]; [CATransaction setDisableActions:YES]; layer.content = someImageRef; [CATransaction commit];

En Swift, me gusta usar este método de extensión:

extension CATransaction { class func withDisabledActions<T>(_ body: () throws -> T) rethrows -> T { CATransaction.begin() CATransaction.setDisableActions(true) defer { CATransaction.commit() } return try body() } }

Puede usarlo así:

CATransaction.withDisabledActions { // your stuff here }


De otra manera:

  1. Debe deshabilitar la animación predeterminada de sheet.layer, que se llama implícitamente cuando se agrega la subcapa.

  2. También debe contenido-animación de cada subcapa. Por supuesto, puede usar "kCATransactionDisableActions" de CATransaction cada vez que configure sublayer.content. Sin embargo, puede deshabilitar esta animación una vez, cuando está creando su subcapa.

Aquí está el código:

// disable animation of container sheet.layer.actions = [NSDictionary dictionaryWithObject:[NSNull null] forKey:@"sublayers"]; // disable animation of each sublayer sublayer.layer.actions = [NSDictionary dictionaryWithObject:[NSNull null] forKey:@"content"]; // maybe, you''ll also have to disable "onOrderIn"-action of each sublayer.


Tienes que desactivar explícitamente las animaciones envolviendo tu código en una CATransacción

[CATransaction begin]; [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; layer.content = someImageRef; [CATransaction commit];


Rápido

CATransaction.begin() CATransaction.setDisableActions(true) // change layer properties that you don''t want to animate CATransaction.commit()


Swift 2

Pude desactivar todas las animaciones de la siguiente manera, donde myView es la vista con la que está trabajando:

myView.layer.sublayers?.forEach { $0.removeAllAnimations() }

Y como nota al margen, eliminando todas las capas:

myView.layer.sublayers?.forEach { $0.removeFromSuperlayer() }