(Примечание: я не очень разбираюсь в Какао, так как я в основном разработчик для iOS; я не тестировал ни один из следующих материалов)
Я думаю, что проблемаВы пытаетесь смешать CoreAnimation и Animator Proxy.Вы не добавляете анимацию к Animator, а к слою:
[[imageView layer] addAnimation:animation forKey:@"myTest"];
Другая возможность может состоять в том, чтобы использовать NSViewAnimation и связывать их вместе.См. Руководство по программированию анимации для какао , стр. 13. Таким образом, у вас будет одна анимация, чтобы двигаться в одном направлении, и когда она закончится, она запускает вторую, которая возвращается назад.Кажется, это работает так:
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];
Затем в Lion (OS X 10.7) вы можете установить обработчик завершения при использовании Animator Proxy .Это должно работать так:
[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];