NSWindow翻转动画 - 喜欢iWork

时间:2012-07-03 14:08:55

标签: cocoa animation transition nswindow flip

我正在尝试实现与iWork相同的窗口翻转 -

https://dl.dropbox.com/u/2338382/Window%20Flipping.mov

然而,我似乎无法找到一种直截了当的方法。一些教程建议将窗口两侧的快照图像粘贴在一个更大的透明窗口中,并为其设置动画。这可能有用,但看起来有点hacky,示例代码总是臃肿。一些教程建议使用私有API,因为这个应用程序可能是MAS绑定的,我想避免这种情况。

我该如何实施?有人有任何提示吗?

NSWindow +翻转

我已将下面链接的古代代码重写为NSWindow + Flipping。您可以从my misc. Cocoa collection on GitHub, PCSnippets获取这些源文件。

1 个答案:

答案 0 :(得分:4)

您可以使用 CoreGraphics框架来实现这一目标。看看这个:

- (void) flipWithDuration: (float) duration forwards: (BOOL) forwards
{
  CGSTransitionSpec spec;
  CGSTransitionHandle transitionHandle;
  CGSConnection cid = CGSDefaultConnection;

  spec.type = CGSFlip;
  spec.option = 0x80 | (forwards ? 2 : 1);
  spec.wid = [self windowNumber];
  spec.backColor = nil;

  transitionHandle = -1;
  CGSNewTransition (cid, &spec, &transitionHandle);
  CGSInvokeTransition (cid, transitionHandle, duration);
  [[NSRunLoop currentRunLoop] runUntilDate: 
        [NSDate dateWithTimeIntervalSinceNow: duration]];
  CGSReleaseTransition (cid, transitionHandle);
}

您可以下载示例项目:here。更多信息here

<强>更新

看看this project。这实际上就是你需要的。

  

关于此项目:

     

NSWindow上的此类别允许您切换一个窗口   另一个,使用由Dashboard小部件推广的“翻转”动画。   这是学习CoreImage以及如何学习的好借口   在Cocoa中使用它。演示应用程序显示了如何使用它。滚动到最后   看看这个版本有什么新功能!

     

基本上,您需要做的就是:

[someWindow flipToShowWindow:someOtherWindow forward:YES];
  

然而,这段代码做了一些假设: - someWindow(最初的   窗口已在屏幕上显示。 - someOtherWindow(最后的   窗口)尚未在屏幕上显示。 - 两个窗户都可以   调整大小相同,并且不会太大或太复杂 -   后一种情况不太重要,CPU /视频卡越快   是。 - 动画运行时窗口不会消失。 -   用户不会尝试单击动画窗口或执行某些操作   动画正在运行。

     

实施非常简单。我把决赛移到了   与初始窗口相同的位置和大小。然后我定位一个更大的   透明窗口,因此它覆盖该框架。我渲染两个窗口   内容到CIImages,隐藏两个窗口,并启动动画。   动画的每一帧都会将透视失真的图像渲染成   透明的窗户。动画完成后,我会显示最终结果   窗口。一些技巧用于加快速度;翻转的窗口   只设置一次;通过将其alpha设置为隐藏最终窗口   例如,0.0,不是通过排序,然后再将其重新排序。

     

主要瓶颈是CoreImage过滤器和第一帧   渲染总是需要更长的时间 - 所需的4到6倍   剩余的帧。我想这个时间花在了设置和   下载到视频卡。所以我计算了这个时间和   在旋转开始显示的阶段绘制第二帧。该   动画从这一点开始,但是,如果前两帧占用了   太久了,我延长了时间,以确保至少5个以上   帧将被渲染。这将发生在慢速硬件或大型硬件上   视窗。最后,我根本不渲染最后一帧并交换   最后一个窗口。