2008-12-01 7 views
3

J'ai une animation qui déplace certaines vues. Lorsque cette animation est terminée, je veux que la fenêtre recalcule la boucle keyview. Mon code est simmilar au suivi du code maquette:Comment déclencher un rappel lorsqu'un NSAnimationContext se termine?

[NSAnimationContext beginGrouping];   
[newView setAlpha: 0.0]; //hide newView 
[self addSubView:newView]; 

//position the views 
[[oldView animator] setFrame: newFrame1]; 
[[newView animator] setFrame: newFrame2]; 

[[newView animator] setAlpha: 1.0]; //fade-in newView 

[NSAnimationContext endGrouping]; 

[[self window] recalculateKeyViewLoop]; 

Le problème avec ce code est que recalculateKeyViewLoop est appelé avant que les vues sont dans leurs nouvelles positions qui signifie que le keyviewloop est erroné.

Comment résoudre ce problème?

Mon premier cependant est d'appeler recalculateKeyViewLoop dans un rappel de quand l'animation se termine mais je n'arrive pas à comprendre comment faire ceci.

Répondre

4

Vous devriez être en mesure d'envoyer -animationForKey: à votre point de vue d'obtenir un CAAnimation exemple , puis définissez-vous comme son délégué et implémentez la méthode Adam mentioned.

5

Quelque chose qui est pas si évident, ou du moins n'a pas été pour moi, est qu'il ya deux animations en cours lorsque vous faites une setFrame:, avec des touches frameSize et frameOrigin. En fonction de vos cadres d'origine et final, vous devrez peut-être vous inscrire en tant que délégué pour l'un ou les deux.

Je vous recommande également de faire une copie de l'animation que vous obtenez de -animationForKey: et de stocker votre copie modifiée dans le dictionnaire animations de votre objet. De cette façon, votre délégué ne sera appelé qu'à la fin de la durée de l'animateur de ces objets, par rapport à tous les objets qui l'animent.

par ex. De cette manière, votre objet d'animation remplacera l'objet d'animation par défaut pour cette vue. mettre en œuvre des méthodes selon Ensuite, délégué vous êtes intéressé par

0

Si vous animez un NSWindow (par opposition à un NSView), les autres réponses ne fonctionnera pas et vous devez le faire à la place:

CAAnimation *animation = [CABasicAnimation animation]; 
animation.delegate = self; 
self.window.animations = @{@"frame": animation}; 
[[self.window animator] setFrame:NSMakeRect(0, 0, 400, 200) display:YES]; 

qui sera ensuite appeler la méthode animationDidStop:finished: sur votre délégué (qui, dans le code ci-dessus serait self)

1

Vous pouvez utiliser un gestionnaire d'achèvement comme celui-ci:

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){ 
    // Start some animations. 
    [[myView animator] setFrameSize:newViewSize]; 
    [[myWindow animator] setFrame:newWindowFrame display:YES]; 
} completionHandler:^{ 
    // This block will be invoked when all of the animations started above have completed or been cancelled. 
    NSLog(@"All done!"); 
}]; 
Questions connexes