我对CoreAnimation不太熟悉,所以我希望我错过了一些非常简单的东西。我想用[[view animator] setGradient:gradient];
以简单的方式为NSView的自定义属性( NSGradient )设置动画。我定义了+ (id)defaultAnimationForKey:(NSString *)key
并返回了一个简单的CABasicAnimation,但是没有执行动画。由于这适用于更简单的类型和NSColor,我猜CABasicAnimation不适用于渐变。很好,但在这种特殊情况下,渐变是微不足道的(总是两个停止),因此我可以轻松编写插值函数。 问题:如何定义自定义插值?关于视图,图层和动画,子类化动画类等的代表,我用Google搜索,但我无法弄清楚这些事情。谢谢!
答案 0 :(得分:1)
我以为我记得当我学习如何使用Core Animation时,通过一些Apple文档来展示如何设置无法由定义动画提供的属性描述来处理的动画。在此过程中,我偶然发现了Apple的一些示例代码:
显示单个渐变图层,并使用新的随机颜色连续动画。
这可能是您已经以另一种方式处理的具体任务的答案。我在Xcode中的Documentation and API Reference中找到了它,示例代码的名称只是 Gradients 。 (请注意,今年4月有一个原始版本1.0和更新版本1.1重做,所以应该更容易使用当前工具。
但是,创建一个无法通过Core Animation本身自动化的自定义动画的更大问题是遵循Apple 动画编程指南Cocoa 中的示例使用NSAnimation对象。它在 Subclassing NSAnimation 主题下进行了描述,推荐的方法显示在平滑动画标题下。您覆盖 setCurrentProgress:
方法,以便每次调用时首先调用 Super
,以便 NSAnimation 更新进度值,即您的自定义动画属性,然后执行动画的下一帧所需的任何更新或绘图。以下是Apple在参考文档中提供的注释和示例代码:
如“设置和处理进度标记”中所述,您可以将一系列进度标记附加到NSAnimation对象,并让委托实现动画:didReachProgressMark:方法来重绘每个进度标记处的对象。但是,这不是对对象进行动画处理的最佳方法。除非你设置了大量的进度标记(每秒30个或更多),否则动画可能会显得不稳定。
更好的方法是子类化NSAnimation并覆盖setCurrentProgress:方法,如清单4所示.NSAnimation对象在每个帧之后调用此方法来更改进度值。通过拦截此消息,您可以执行该帧所需的任何重绘或更新。如果你覆盖了这个方法,请务必调用super的实现,以便它可以更新当前进度。
Listing 4 Overriding the setCurrentProgress: method
- (void)setCurrentProgress:(NSAnimationProgress)progress
{
// Call super to update the progress value.
[super setCurrentProgress:progress];
// Update the window position.
NSRect theWinFrame = [[NSApp mainWindow] frame];
NSRect theScreenFrame = [[NSScreen mainScreen] visibleFrame];
theWinFrame.origin.x = progress *
(theScreenFrame.size.width - theWinFrame.size.width);
[[NSApp mainWindow] setFrame:theWinFrame display:YES animate:YES];
}
所以基本上你定义了一个“进度值”(可能由多个值组成),它定义了自定义动画的状态,并编写了给定当前“进度值”的代码,用于绘制或更改动画在此时绘制的内容。特殊的国家。然后让NSAnimation使用设置动画的常规方法运行动画,它将执行代码以在适当的时间绘制动画的每个帧。
我希望能回答你想知道的事情。我怀疑我之前没有看过它就能轻易找到这个,因为我最终不得不去我认为可能的地方,并逐页浏览整个主题再次找到它!