【问题标题】:NSWindow Flip Animation - Like iWorkNSWindow 翻转动画 - 像 iWork
【发布时间】:2012-07-03 23:48:25
【问题描述】:

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

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

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

我应该如何实现这个?有人有什么提示吗?

NSWindow+翻转

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

【问题讨论】:

标签: cocoa animation transition nswindow flip


【解决方案1】:

您可以使用 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 以及如何 在可可中使用它。演示应用程序展示了如何使用它。滚动到最后 看看这个版本有什么新东西!

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

[someWindow flipToShowWindow:someOtherWindow forward:YES];

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

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

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

【讨论】:

  • 2个问题:1、这是否使用私有API调用? 2,当我使用它时,我会翻转(YAY)但我会失去阴影和圆角(嘘)。有没有办法解决这个问题?
  • 我不知道 100% 这不是使用私有 API,但我认为没有。嗯..是的,这是一个错误..
  • 是的...即使我 可以 摆脱潜在的私有 API 调用,我也无法发布这种视觉上出现故障的东西。如果您找到一种方法来清理它,请发布!这是迄今为止最有希望的领先优势。
  • 任何以“CGS”为前缀的 CoreGraphics API 都是私有 API。 “CG”API 是唯一的公共 API。
  • @JustinBoo 当我将 NSWindow_Flipr 放到我的项目中(原样)时,窗口会翻转,但 非常 很慢,完成后会永远消失。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 2021-11-29
  • 2018-04-22
  • 1970-01-01
  • 2011-03-22
  • 2019-08-18
相关资源
最近更新 更多