2012-04-15 19 views
7

Creé 2 NSAnimation objetos para voltear la vista con otra vista. Me gustaría ejecutar 2 estas animaciones simultáneamente. No puedo usar NSViewAnimation, ya que ahora se trata de animar cualquiera de las propiedades de vista.¿hay alguna forma de ejecutar 2 objetos NSAnimation simultáneamente?

Aquí está la creación de animación:

self.animation = [[[TransitionAnimation alloc] initWithDuration:1.0 animationCurve:NSAnimationEaseInOut] autorelease]; 
[self.animation setDelegate:delegate]; 
[self.animation setCurrentProgress:0.0]; 

[self.animation startAnimation]; 

Me trataron de vincular 2 animaciones, pero probablemente no ha funcionado por alguna razón. Tomé un ejemplo de: Apple developer site

configurar el objeto NSAnimation utilizar NSAnimationNonblocking no muestra ningún tipo de animación en absoluto ...

EDIT: La segunda animación es exactamente el mismo que el primero de ellos y ha creado en el mismo lugar donde se creó el primero

TransitionAnimation es una subclase de NSAnimation, donde el setCurrentProgress parece que:

- (void)setCurrentProgress:(NSAnimationProgress)progress { 
    [super setCurrentProgress:progress]; 
    [(NSView *)[self delegate] display];  
} 

la delegate es NSView en este caso, que en su función drawRect aplica una función del tiempo en un CIFilterCIImage. El problema es que se ejecuta sincrónico y la segunda animación comienza justo después del final de la primera. ¿Hay alguna forma de ejecutarlos simultáneamente?

+1

¿Dónde está la segunda animación? ¿Y de qué manera las cosas no funcionaron? –

Respuesta

17

NSAnimation no es realmente la mejor opción para animar múltiples objetos y sus propiedades simultáneamente.

En su lugar, debe hacer que sus vistas se ajusten al protocolo NSAnimatablePropertyContainer.

Luego, puede configurar varias propiedades personalizadas como animatable (además de las propiedades ya soportados por NSView), y luego puede simplemente usar sus puntos de vista animator proxy para animar las propiedades:

yourObject.animator.propertyName = finalPropertyValue; 

Aparte de hacer animación muy simple, sino que también permite animar objetos múltiples simultáneamente utilizando un NSAnimationContext:

[NSAnimationContext beginGrouping]; 
firstObject.animator.propertyName = finalPropertyValue1; 
secondObject.animator.propertyName = finalPropertyValue2; 
[NSAnimationContext endGrouping]; 

también puede establecer la duración y suministrar una blo manejador de finalización CK:

[NSAnimationContext beginGrouping]; 
[[NSAnimationContext currentContext] setDuration:0.5]; 
[[NSAnimationContext currentContext] setCompletionHandler:^{ 
    NSLog(@"animation finished"); 
}]; 
firstObject.animator.propertyName = finalPropertyValue1; 
secondObject.animator.propertyName = finalPropertyValue2; 
[NSAnimationContext endGrouping]; 

Los NSAnimation y NSViewAnimation clases son mucho más antiguas que el apoyo animador proxy y le recomiendo que uno se aleja de ellos si es posible. Soportar el protocolo NSAnimatablePropertyContainer es mucho más simple que administrar todas las cosas delegadas NSAnimation. El soporte de Lion para funciones de temporización personalizadas y controladores de finalización significa que ya no hay necesidad de hacer eso.

Para una NSView objeto estándar, si desea agregar ayuda de la animación a una propiedad, en su opinión, sólo tiene que reemplazar el método +defaultAnimationForKey: en su opinión y regresar una animación de la propiedad:

//declare the default animations for any keys we want to animate 
+ (id)defaultAnimationForKey:(NSString *)key 
{ 
    //in this case, we want to add animation for our x and y keys 
    if ([key isEqualToString:@"x"] || [key isEqualToString:@"y"]) { 
     return [CABasicAnimation animation]; 
    } else { 
     // Defer to super's implementation for any keys we don't specifically handle. 
     return [super defaultAnimationForKey:key]; 
    } 
} 

Creé un simple sample project que muestra cómo animar múltiples propiedades de una vista simultáneamente usando el protocolo NSAnimatablePropertyContainer.

Todo lo que necesita hacer para actualizar correctamente es asegurarse de que se llame a setNeedsDisplay:YES cuando se modifique cualquiera de las propiedades animables. A continuación, puede obtener los valores de esas propiedades en su método drawRect: y actualizar la animación en función de esos valores.

Si desea un valor progreso simple que es análogo a la forma en que las cosas funcionan con NSAnimation, se podría definir una propiedad progress en su vista y luego hacer algo como esto:

yourView.progress = 0; 
[yourView.animator setProgress:1.0]; 

A continuación, puede acceder self.progress en su método drawRect: para averiguar el valor actual de la animación.

+0

¡Muchas gracias! No estaba al tanto de esto. De alguna manera no lo alcancé en la búsqueda de google. Lo intentaré y te lo haré saber. –

+0

Tengo curiosidad: si tenemos problemas de rendimiento (baja velocidad de cuadros) con NSAnimation, ¿sería útil la aplicación de este protocolo? – Zakman411

+0

Eso depende de lo que está causando la baja tasa de cuadros. El proxy de animación no es una bala mágica y aún hará que tus vistas se dibujen, por lo que si el dibujo/composición es lento, cambiar a esta tecnología no va a hacer mucha diferencia. Lo más probable es que necesite utilizar una tecnología de representación de alto rendimiento, como Core Animation, que está específicamente diseñada para procesar la animación sin problemas. –

Cuestiones relacionadas