动画没有显示

时间:2011-07-18 03:47:11

标签: cocoa core-animation

这是我使用核心动画的可可应用程序的代码片段,不知何故动画没有显示。

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不起作用。

第一个出了什么问题?如何使反向运动在第二个工作?谢谢!

2 个答案:

答案 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];