首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法同时运行2个NSAnimation对象?

有没有办法同时运行2个NSAnimation对象?
EN

Stack Overflow用户
提问于 2012-04-16 05:56:51
回答 1查看 3.2K关注 0票数 8

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

下面是动画的创建:

代码语言:javascript
复制
self.animation = [[[TransitionAnimation alloc] initWithDuration:1.0 animationCurve:NSAnimationEaseInOut] autorelease];
[self.animation setDelegate:delegate];
[self.animation setCurrentProgress:0.0];

[self.animation startAnimation];

我试着链接两个动画,但可能由于某些原因不起作用。我举了一个例子:Apple developer site

NSAnimation对象配置为使用NSAnimationNonblocking根本不会显示任何动画...

编辑:第二个动画与第一个动画完全相同,并且在创建第一个动画的相同位置创建。

TransitionAnimationNSAnimation的子类,其中的setCurrentProgress如下所示:

代码语言:javascript
复制
- (void)setCurrentProgress:(NSAnimationProgress)progress {
    [super setCurrentProgress:progress];
    [(NSView *)[self delegate] display];    
}

在本例中,delegateNSView,在其drawRect函数中,它在CIImage上应用与时间相关的CIFilter。问题是它是同步运行的,第二个动画在第一个动画结束后立即开始。有没有办法同时运行它们?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-16 12:49:08

NSAnimation并不是同时为多个对象及其属性设置动画的最佳选择。

相反,您应该使视图符合NSAnimatablePropertyContainer协议。

然后,您可以将多个自定义属性设置为可动画(除了NSView已经支持的属性之外),然后您可以简单地使用视图的animator代理来为属性设置动画:

代码语言:javascript
复制
yourObject.animator.propertyName = finalPropertyValue;

除了使动画非常简单之外,它还允许您使用NSAnimationContext同时为多个对象制作动画

代码语言:javascript
复制
[NSAnimationContext beginGrouping];
firstObject.animator.propertyName = finalPropertyValue1;
secondObject.animator.propertyName = finalPropertyValue2;
[NSAnimationContext endGrouping];

您还可以设置持续时间并提供完成处理程序块:

代码语言:javascript
复制
[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:方法并返回该属性的动画即可:

代码语言:javascript
复制
//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属性,然后执行以下操作:

代码语言:javascript
复制
yourView.progress = 0;
[yourView.animator setProgress:1.0];

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

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10166498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档