4

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

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

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

我应该如何实施呢?有没有人有任何提示?

NSWindow+翻转

我已经将下面链接的古老代码重写为 NSWindow+Flipping。您可以从我的 misc中获取这些源文件。GitHub 上的 Cocoa 集合,PCSnippets

4

1 回答 1

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。更多信息在这里

更新:

看看这个项目。这实际上是您所需要的。

关于这个项目:

此类别NSWindow允许您使用仪表板小部件普及的“翻转”动画将一个窗口切换到另一个窗口。这是学习有关 CoreImage 以及如何在 Cocoa 中使用它的一个很好的借口。演示应用程序展示了如何使用它。滚动到最后,看看这个版本有什么新东西!

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

[someWindow flipToShowWindow:someOtherWindow forward:YES];

但是,此代码做了一些假设: — someWindow(初始窗口)已经在屏幕上可见。— someOtherWindow(最终窗口)在屏幕上尚不可见。— 两个窗口都可以调整为相同的大小,并且不会太大或太复杂 — CPU/显卡越快,后一种条件就越不重要。— 动画运行时窗口不会消失。— 用户不会在动画运行时尝试点击动画窗口或做某事。

实现非常简单。我将最终窗口移动到与初始窗口相同的位置和大小。然后我放置一个更大的透明窗口,使其覆盖该框架。我将两个窗口内容都渲染到 CIImages 中,隐藏两个窗口,然后启动动画。动画的每一帧都将透视扭曲的图像渲染到透明窗口中。动画完成后,我会显示最终窗口。使用了一些技巧来加快速度;翻转窗口只设置一次;例如,最终窗口通过将其 alpha 设置为 0.0 来隐藏,而不是通过将其排序然后再将其重新排序。

主要瓶颈是 CoreImage 过滤器,第一帧的渲染时间总是要长得多——是其余帧的 4 或 6 倍。我想这段时间花在设置和下载到视频卡上。所以我计算了这需要的时间,并在旋转开始显示的阶段绘制第二帧。动画从此时开始,但是,如果前两帧花费的时间太长,我会延长持续时间以确保至少再渲染 5 帧。这将发生在缓慢的硬件或大窗口中。最后,我根本不渲染最后一帧,而是交换最后一个窗口。

于 2012-07-03T14:33:10.217 回答