我创建了 2 个NSAnimation
对象,用于用另一个视图翻转视图。我想同时运行 2 个这样的动画。我不能使用NSViewAnimation
,因为它现在是关于动画任何视图属性。
这是动画创作:
self.animation = [[[TransitionAnimation alloc] initWithDuration:1.0 animationCurve:NSAnimationEaseInOut] autorelease];
[self.animation setDelegate:delegate];
[self.animation setCurrentProgress:0.0];
[self.animation startAnimation];
我尝试链接 2 个动画,但由于某种原因可能不起作用。我举了一个例子:苹果开发者网站
将 NSAnimation
对象配置为使用 NSAnimationNonblocking
根本不显示任何动画...
编辑:第二个动画与第一个动画完全相同,并在创建第一个动画的同一位置创建。
TransitionAnimation
是 NSAnimation
的一个子类,其中setCurrentProgress
如下所示:
- (void)setCurrentProgress:(NSAnimationProgress)progress {
[super setCurrentProgress:progress];
[(NSView *)[self delegate] display];
}
在这种情况下,delegate
NSView
,它在其 drawRect 函数中对CIImage
应用与时间相关的CIFilter
。问题是它是同步运行的,第二个动画在第一个动画结束后立即开始。有没有办法同时运行它们?
>NSAnimation
并不是同时对多个对象及其属性进行动画处理的最佳选择。
相反,您应该使视图符合NSAnimatablePropertyContainer
协议。
然后,您可以将多个自定义属性设置为可动画化(除了 NSView
已经支持的属性之外),然后只需使用视图的animator
代理即可对属性进行动画处理:
yourObject.animator.propertyName = finalPropertyValue;
除了使动画非常简单之外,它还允许您使用NSAnimationContext
同时对多个对象进行动画处理:
[NSAnimationContext beginGrouping];
firstObject.animator.propertyName = finalPropertyValue1;
secondObject.animator.propertyName = finalPropertyValue2;
[NSAnimationContext endGrouping];
您还可以设置持续时间并提供完成处理程序块:
[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:0.5];
[[NSAnimationContext currentContext] setCompletionHandler:^{
NSLog(@"animation finished");
}];
firstObject.animator.propertyName = finalPropertyValue1;
secondObject.animator.propertyName = finalPropertyValue2;
[NSAnimationContext endGrouping];
NSAnimation
和 NSViewAnimation
类比动画器代理支持要旧得多,我强烈建议您尽可能远离它们。支持 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];
}
}
我创建了一个简单的示例项目,演示如何使用NSAnimatablePropertyContainer
协议同时对视图的多个属性进行动画处理。
要成功更新视图,您需要做的就是确保在修改任何可动画属性时调用setNeedsDisplay:YES
。然后,可以在 drawRect:
方法中获取这些属性的值,并根据这些值更新动画。
如果你想要一个简单的进度值,类似于处理NSAnimation
的方式,你可以在你的视图上定义一个progress
属性,然后做如下的事情:
yourView.progress = 0;
[yourView.animator setProgress:1.0];
然后,可以在drawRect:
方法中访问self.progress
以找出动画的当前值。