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.
¿Dónde está la segunda animación? ¿Y de qué manera las cosas no funcionaron? –