2011-07-18 5 views
3

Voici mon extrait de code pour l'application de cacao en utilisant l'animation de base, en quelque sorte l'animation ne s'affiche pas.L'animation ne montre pas

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; 
[animation setDelegate:self]; 

NSRect pos = [imageView frame]; 
[animation setFromValue:[NSValue valueWithRect:pos]]; 
NSPoint point = NSMakePoint(pos.origin.x-40, pos.origin.y); 

[animation setToValue:[NSValue valueWithPoint:point]]; 
[animation setDuration:2.0]; 

[[imageView animator] addAnimation:animation forKey:@"myTest"]; 

alors que c'est le code de travail:

NSRect position = [imageView frame]; 
position.origin.x -= 40; 
[[imageView animator] setFrame:position]; 

Mais autoReverse ne fonctionne pas.

Quelque chose ne va pas avec le premier? Et comment faire fonctionner le mouvement inverse dans le 2ème? Merci!

Répondre

0

Je ne sais pas avec certitude, mais pour le premier, la position est un CGPoint, vous pouvez donc essayer d'utiliser ce type pour vos valeurs fromValue et toValue. Vous utilisez actuellement un NSRect et un NSPoint (le dernier devrait fonctionner, mais pas sûr de l'ancien).

Pour la seconde, comment spécifiez-vous l'inversion automatique? + setAnimationRepeatAutoreverses doit être appelé à partir d'un bloc d'animation (après "beginAnimations")

0

(Note: Je ne suis pas très expérimenté avec Cocoa puisque je suis principalement un développeur iOS, je n'ai testé aucun des choses suivantes)

Je pense que le problème est que vous essayez de mélanger CoreAnimation et Animator Proxy. Vous ne pas ajouter l'animation à l'Animator, mais à la couche:

[[imageView layer] addAnimation:animation forKey:@"myTest"]; 

Une autre possibilité pourrait être d'utiliser NSViewAnimation et les enchaîner ensemble. Voir le Animation Programming Guide for Cocoa, page 13. Vous auriez donc une animation à faire dans une direction, et une fois que c'est fini, elle déclenchera la seconde qui revient en arrière. Il semble fonctionner comme ceci:

NSMutableDictionary *firstDict = [NSMutableDictionary dictionary]; 
[firstDict setObject:imageView forKey:NSViewAnimationTargetKey]; 
[firstDict setObject:[NSValue valueWithRect:originalFrame] forKey:NSViewAnimationStartFrameKey]; 
[firstDict setObject:[NSValue valueWithRect:targetFrame] forKey:NSViewAnimationEndFrameKey]; 

NSMutableDictionary *secondDict = [NSMutableDictionary dictionary]; 
[secondDict setObject:imageView forKey:NSViewAnimationTargetKey]; 
[secondDict setObject:[NSValue valueWithRect:targetFrame] forKey:NSViewAnimationStartFrameKey]; 
[secondDict setObject:[NSValue valueWithRect:originalFrame] forKey:NSViewAnimationEndFrameKey]; 

NSViewAnimation *firstAnimation = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObject:firstDict]]; 
[firstAnimation setDuration:2.0]; 

NSViewAnimation *secondAnimation = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObject:secondDict]]; 
[secondAnimation setDuration:2.0]; 

[secondAnimation startWhenAnimation:firstAnimation reachesProgress:1.0]; 
[firstAnimation startAnimation]; 

Puis, Lion (OS X 10.7) vous pouvez définir un completion handler when using Animator Proxy. Cela devrait fonctionner comme ceci:

[NSAnimationContext beginGrouping]; 
[[NSAnimationContext currentContext] setDuration:2.0]; 
[[NSAnimationContext currentContext] setCompletionHandler:^(void) { 
    // Here comes your code for the reverse animation. 
    [NSAnimationContext beginGrouping]; 
    [[NSAnimationContext currentContext] setDuration:2.0]; 
    [[aView animator] setFrameOrigin:originalPosition]; 
    [NSAnimationContext endGrouping]; 
}]; 
[[aView animator] setFrameOrigin:position]; 
[NSAnimationContext endGrouping];