objective-c - 有没有办法同时运行 2 个 NSAnimation 对象?

标签 objective-c cocoa osx-lion core-image nsanimation

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

这里是动画创建:

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];    
}

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

最佳答案

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

相反,您应该使您的 View 符合 NSAnimatablePropertyContainer协议(protocol)。

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

yourObject.animator.propertyName = finalPropertyValue;

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

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

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

[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 协议(protocol)比管理所有 NSAnimation 委托(delegate)内容简单。 Lion 对自定义计时函数和完成处理程序的支持意味着真的没有必要再这样做了。

对于一个标准的NSView对象,如果你想在你的 View 中添加一个属性的动画支持,你只需要在你的 View 中覆盖+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 协议(protocol)同时为 View 的多个属性设置动画。

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

如果您想要一个类似于 NSAnimation 的工作方式的简单进度值,您可以在 View 上定义一个 progress 属性,然后执行如下操作:

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

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

关于objective-c - 有没有办法同时运行 2 个 NSAnimation 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10166498/

相关文章:

java - osx lion 上的 IntelliJ IDEA - 如何设置 JSDK?

macos - Mac 模拟器屏幕错误。屏幕和触摸不同步

ios - 如何为 UINavigationBar setBackgroundImage 设置动画 : forBarMetrics:?

objective-c - 从网页中提取文本并将其显示在ios上的textview中

cocoa - 在 Mac OS X 10.7 中写入 "~/Library/Application Support"文件夹

objective-c - 如何在 Objective-C 中将范围转换为 NSArray

objective-c - 如何获取NSTableView动画委托(delegate)事件?

objective-c - 如何将我的应用程序添加到 iphone/ipad 的设置中?

ios - 如何在sqlite数据库的表行中添加NSDictionary

iphone - "Bundle identifier"的重要性