您可以使用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 帧。这将发生在缓慢的硬件或大窗口中。最后,我根本不渲染最后一帧,而是交换最后一个窗口。