NSAnimation
ist nicht wirklich die beste Wahl für die gleichzeitige Animation mehrerer Objekte und ihrer Eigenschaften.
Stattdessen sollten Sie Ihre Ansichten dem NSAnimatablePropertyContainer
Protokoll entsprechen.
Sie können dann mehrere benutzerdefinierte Eigenschaften als animierbaren (zusätzlich zu den Eigenschaften bereits unterstützt von NSView
), und dann können Sie einfach Ihre Ansichten verwenden animator
Proxy zu animieren, die Eigenschaften ein:
yourObject.animator.propertyName = finalPropertyValue;
Apart Animation sehr einfach aus zu machen, ermöglicht es Ihnen auch mehrere Objekte gleichzeitig mit einer NSAnimationContext
animieren:
[NSAnimationContext beginGrouping];
firstObject.animator.propertyName = finalPropertyValue1;
secondObject.animator.propertyName = finalPropertyValue2;
[NSAnimationContext endGrouping];
Sie können auch die Dauer einstellen und einen Abschluss-Handler blo liefern ck:
[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:0.5];
[[NSAnimationContext currentContext] setCompletionHandler:^{
NSLog(@"animation finished");
}];
firstObject.animator.propertyName = finalPropertyValue1;
secondObject.animator.propertyName = finalPropertyValue2;
[NSAnimationContext endGrouping];
Die NSAnimation
und NSViewAnimation
Klassen sind viel älter als die Unterstützung Animator Proxy und ich empfehle, dass Sie von ihnen wegbewegen, wenn möglich. Unterstützung für die NSAnimatablePropertyContainer
Protokoll ist viel einfacher als die Verwaltung aller NSAnimation
Delegate Zeug. Die Lion-Unterstützung für benutzerdefinierte Timing-Funktionen und Completion-Handler bedeutet, dass dies wirklich nicht mehr nötig ist.
Für ein Standard-NSView
Objekt, wenn Sie Unterstützung für Animationen auf eine Eigenschaft in Ihrer Ansicht hinzufügen mag, müssen Sie nur die +defaultAnimationForKey:
Methode Ihrer Ansicht nach außer Kraft zu setzen und eine Animation für die Eigenschaft zurück:
//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];
}
}
Ich habe eine einfache sample project erstellt, die zeigt, wie mehrere Eigenschaften einer Ansicht gleichzeitig mit dem NSAnimatablePropertyContainer
Protokoll zu animieren.
Alles, was Sie für eine erfolgreiche Aktualisierung benötigen, ist sicherzustellen, dass setNeedsDisplay:YES
aufgerufen wird, wenn eine der animierbaren Eigenschaften geändert wird. Sie können dann die Werte dieser Eigenschaften in Ihrer drawRect:
-Methode abrufen und die Animation basierend auf diesen Werten aktualisieren.
Wenn Sie einen einfachen Fortschritt Wert wollen, die auf die Art und Weise analog ist, die Dinge mit NSAnimation
arbeiten, könnten Sie ein progress
Eigentum auf Ihrer Ansicht definieren und dann so etwas tun:
yourView.progress = 0;
[yourView.animator setProgress:1.0];
Sie können dann self.progress
zugreifen in Ihrer drawRect:
Methode, um den aktuellen Wert der Animation herauszufinden.
Wo ist die zweite Animation? Und auf welche Weise haben die Dinge nicht funktioniert? –