2012-04-15 91 views
7

我创建了2 NSAnimation用另一种视图翻转视图的对象。我想同时运行2个这些动画。我不能使用NSViewAnimation,因为它现在是关于动画任何视图属性的。有没有办法同时运行2个NSAnimation对象?

这里是动漫创作:

self.animation = [[[TransitionAnimation alloc] initWithDuration:1.0 animationCurve:NSAnimationEaseInOut] autorelease]; 
[self.animation setDelegate:delegate]; 
[self.animation setCurrentProgress:0.0]; 

[self.animation startAnimation]; 

我尝试连结2级的动画,但可能并没有出于某种原因。我花了一个例子来自: Apple developer site

配置NSAnimation对象使用NSAnimationNonblocking不显示任何动画在所有...

编辑:第二个动画是完全一样的第一个和创建第一个创建的地方相同。

TransitionAnimationNSAnimation,其中setCurrentProgress看起来像一个子类:

- (void)setCurrentProgress:(NSAnimationProgress)progress { 
    [super setCurrentProgress:progress]; 
    [(NSView *)[self delegate] display];  
} 

delegate在这种情况下,在其的drawRect函数应用NSView时间依赖于CIImageCIFilter。问题是它同步运行,第二个动画在第一个动画结束后立即开始。有没有办法同时运行它们?

+1

第二部动画在哪里?什么方法不起作用? – 2012-04-15 23:01:05

回答

17

NSAnimation对于同时动画多个对象及其属性并不是真正的最佳选择。

相反,您应该使您的意见符合NSAnimatablePropertyContainer协议。

然后,您可以设置多个自定义属性为动画(除由NSView已经支持的属性),然后你可以简单地使用你的意见animator代理动画属性:

yourObject.animator.propertyName = finalPropertyValue; 

除了从制作动画非常简单,它也可以让你的动画多个对象同时使用NSAnimationContext

[NSAnimationContext beginGrouping]; 
firstObject.animator.propertyName = finalPropertyValue1; 
secondObject.animator.propertyName = finalPropertyValue2; 
[NSAnimationContext endGrouping]; 

您还可以设置时间,并提供一个完成处理BLO CK:

[NSAnimationContext beginGrouping]; 
[[NSAnimationContext currentContext] setDuration:0.5]; 
[[NSAnimationContext currentContext] setCompletionHandler:^{ 
    NSLog(@"animation finished"); 
}]; 
firstObject.animator.propertyName = finalPropertyValue1; 
secondObject.animator.propertyName = finalPropertyValue2; 
[NSAnimationContext endGrouping]; 

NSAnimationNSViewAnimation类是比动画代理支持大年纪了,我强烈建议你如果可能的话从他们搬走。支持NSAnimatablePropertyContainer协议是比管理所有NSAnimation委托的东西更简单。 Lion对自定义计时功能和完成处理程序的支持意味着实际上不再需要这样做。

对于标准NSView对象,如果你想支持动画添加到一个属性在你看来,你只需要重写视图中的+defaultAnimationForKey:方法,并返回一个动画属性:

//declare the default animations for any keys we want to animate 
+ (id)defaultAnimationForKey:(NSString *)key 
{ 
    //in this case, we want to add animation for our x and y keys 
    if ([key isEqualToString:@"x"] || [key isEqualToString:@"y"]) { 
     return [CABasicAnimation animation]; 
    } else { 
     // Defer to super's implementation for any keys we don't specifically handle. 
     return [super defaultAnimationForKey:key]; 
    } 
} 

我创建了一个简单的sample project,演示了如何使用NSAnimatablePropertyContainer协议同时动画化视图的多个属性。

所有视图需要做成功更新是确保在任何动画的属性被修改setNeedsDisplay:YES被调用。然后,您可以在drawRect:方法中获取这些属性的值,并根据这些值更新动画。

如果你想要一个简单的进度值是类似的事情NSAnimation的工作方式,你可以定义你的视图progress属性,然后做这样的事情:

yourView.progress = 0; 
[yourView.animator setProgress:1.0]; 

然后,您可以访问self.progress在你的drawRect:方法中找出动画的当前值。

+0

非常感谢!我不知道这一个。不知何故,我没有达到谷歌搜索。将尝试并让你知道。 – 2012-04-16 05:36:46

+0

我只是很好奇:如果我们有NSAnimation的性能(低帧率)问题,应用这个协议可能有帮助吗? – Zakman411 2012-05-09 08:18:42

+0

这取决于什么导致低帧率。动画代理不是一个神奇的子弹,它仍然会让你的视图画出来,所以如果绘图/合成速度很慢,那么转向这项技术不会产生很大的不同。更可能的是,您需要使用更高性能的渲染技术,例如Core Animation,它专门用于平滑渲染动画。 – 2012-05-10 00:13:13

相关问题