我正在尝试实现与iWork相同的窗口翻转 -
https://dl.dropbox.com/u/2338382/Window%20Flipping.mov
然而,我似乎无法找到一种直截了当的方法。一些教程建议将窗口两侧的快照图像粘贴在一个更大的透明窗口中,并为其设置动画。这可能有用,但看起来有点hacky,示例代码总是臃肿。一些教程建议使用私有API,因为这个应用程序可能是MAS绑定的,我想避免这种情况。
我该如何实施?有人有任何提示吗?
我已将下面链接的古代代码重写为NSWindow + Flipping。您可以从my misc. Cocoa collection on GitHub, PCSnippets获取这些源文件。
答案 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);
}
<强>更新强>
看看this project。这实际上就是你需要的。
关于此项目:
NSWindow
上的此类别允许您切换一个窗口 另一个,使用由Dashboard小部件推广的“翻转”动画。 这是学习CoreImage以及如何学习的好借口 在Cocoa中使用它。演示应用程序显示了如何使用它。滚动到最后 看看这个版本有什么新功能!基本上,您需要做的就是:
[someWindow flipToShowWindow:someOtherWindow forward:YES];
然而,这段代码做了一些假设: - someWindow(最初的 窗口已在屏幕上显示。 - someOtherWindow(最后的 窗口)尚未在屏幕上显示。 - 两个窗户都可以 调整大小相同,并且不会太大或太复杂 - 后一种情况不太重要,CPU /视频卡越快 是。 - 动画运行时窗口不会消失。 - 用户不会尝试单击动画窗口或执行某些操作 动画正在运行。
实施非常简单。我把决赛移到了 与初始窗口相同的位置和大小。然后我定位一个更大的 透明窗口,因此它覆盖该框架。我渲染两个窗口 内容到CIImages,隐藏两个窗口,并启动动画。 动画的每一帧都会将透视失真的图像渲染成 透明的窗户。动画完成后,我会显示最终结果 窗口。一些技巧用于加快速度;翻转的窗口 只设置一次;通过将其alpha设置为隐藏最终窗口 例如,0.0,不是通过排序,然后再将其重新排序。
主要瓶颈是CoreImage过滤器和第一帧 渲染总是需要更长的时间 - 所需的4到6倍 剩余的帧。我想这个时间花在了设置和 下载到视频卡。所以我计算了这个时间和 在旋转开始显示的阶段绘制第二帧。该 动画从这一点开始,但是,如果前两帧占用了 太久了,我延长了时间,以确保至少5个以上 帧将被渲染。这将发生在慢速硬件或大型硬件上 视窗。最后,我根本不渲染最后一帧并交换 最后一个窗口。