这是我使用核心动画的可可应用程序的代码片段,不知何故动画没有显示。
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"];
虽然这是工作代码:
NSRect position = [imageView frame];
position.origin.x -= 40;
[[imageView animator] setFrame:position];
但是autoReverse不起作用。
第一个出了什么问题?如何使反向运动在第二个工作?谢谢!
答案 0 :(得分:0)
我不确定,但对于第一个,position是CGPoint,因此您可以尝试将该类型用于fromValue和toValue。您目前正在使用NSRect和NSPoint(后者应该可以使用,但不确定前者)。
对于第二个,你如何指定自动反转?需要从动画块内部调用+ setAnimationRepeatAutoreverses(在“beginAnimations”之后)
答案 1 :(得分:0)
(注意:我对Cocoa不是很有经验,因为我主要是iOS开发人员;我没有测试过以下任何东西)
我认为问题在于您正在尝试混合使用CoreAnimation和Animator Proxy。您不是将动画添加到动画师,而是添加到图层:
[[imageView layer] addAnimation:animation forKey:@"myTest"];
另一种可能性是使用NSViewAnimation并将它们链接在一起。请参阅第13页的Animation Programming Guide for Cocoa。因此,您可以在一个方向上移动一个动画,一旦完成,它会触发第二个动画。它看起来像这样:
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)中,您可以设置completion handler when using 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];