2011-03-26 10 views
11

He estado leyendo que Apple recomienda utilizar animaciones basadas en bloques en lugar de CATransactionexplícitamente deshabilitar la animación UIView en iOS4 +

Antes, yo estaba usando este código para desactivar animaciones:

[CATransaction begin]; 
[CATransaction setDisableActions: YES]; 
// !!! resize 
[CATransaction commit]; 

¿Hay una nuevo método recomendado para hacer esto, o esto todavía está bien?

Respuesta

26
[UIView setAnimationsEnabled:NO]; 
//animate here 
[UIView setAnimationsEnabled:YES]; 
+2

El problema con el uso del enfoque de 'UIView' es que no se pueden anidar es como se hace con' enfoque CATransaction'. Por lo tanto, si tenía un bloque de código que desactivaba las animaciones e hizo una llamada a otra cosa, las animaciones inhabilitadas _inside_ que bloquean las animaciones se volverían a habilitar antes del final de su bloqueo. – jasongregori

+0

manera fácil de arreglar eso es comprobar qué estado era, usando 'areAnimationsEnabled' y luego restaurarlo después de terminar –

+0

¿Qué puedo hacer, si necesito deshabilitar la animación para el objeto de vista concreto? No para todos los reproductores – BergP

3

Para los usuarios MonoTouch (C#), aquí es una clase de ayuda:

public class UIViewAnimations : IDisposable 
{ 
    public UIViewAnimations(bool enabled) 
    { 
     _wasEnabled = UIView.AnimationsEnabled; 
     UIView.AnimationsEnabled = enabled; 
    } 

    public void Dispose() 
    { 
     UIView.AnimationsEnabled = _wasEnabled; 
    } 

    bool _wasEnabled; 
} 

Ejemplo:

using (new UIViewAnimations(false)) 
    imageView.Frame = GetImageFrame(); 
+0

Eso está bien, gracias. –

+1

Me alegro de que alguien lo haya encontrado útil. En esencia: https://gist.github.com/jfoshee/5008117 –

22

Para iOS 7 y por encima de esto ahora se puede lograr con:

[UIView performWithoutAnimation:^{ 
    // Changes we don't want animated here 
    view.alpha = 0.0; 
}]; 
+0

Todavía no obtengo el caso de uso para esto. ¿Por qué me molestaría en envolver esto en un bloque? ¿Por qué no simplemente decir "view.alpha = 0.0;" y termine con eso? –

+4

@GregMaletic Porque a veces el código que se está ejecutando ya es parte de una animación en otro lugar en la pila de llamadas. Esto permite que la actualización no sea animada. –

+0

Ah ... entonces la idea es que esto esté envuelto por alguna otra llamada [UIView animate], y esto es un pequeño retiro interno, ¿así que puedo incluir cosas en ese bloque animado que no quiero animar? –

1

Swift 3+

UIView.performWithoutAnimation { 
      // Update UI that you don't want to animate 
     } 
Cuestiones relacionadas