2

我有一个简单的 NSWindow 动画任务,但仍然找不到完成此任务的方法。

我有一个窗口,我想通过在屏幕边缘之外设置动画来隐藏它。但是连接了 2 台显示器后,我的窗口只会移动到第二台显示器。

有什么方法可以对仅在主屏幕矩形区域中绘制的窗口进行一些剪辑?

我在 Apple 文档中没有找到类似的内容。而且我知道一些 UI 效果是通过一些技巧来模拟所需的行为来实现的。任何信息都非常感谢!

我的第一个猜测是创建一个带有辅助屏幕内容快照的新窗口。然后在这个快照下滑动我的主窗口。但这是一种不好的方式——屏幕上的内容可能会产生动画(如视频)。

4

1 回答 1

4

你将不得不调整它的大小。

显然,调整你的真实窗口的大小是行不通的——你会调整所有视图的大小作为副作用,并且将任何视图的大小调整为零会使它变得疯狂。

因此,您需要执行一些技巧:

  1. 截取窗口的屏幕截图。
  2. 创建一个无边框窗口,其帧大小正好是该图像的大小。(不要使用真实窗口的框架——它不会包含阴影。)
  3. 创建一个 NSView 作为无边框窗口的内容视图。
  4. 创建一个图像视图并将其放在内容视图中。
  5. 将图像视图设置autoresizingMask为在视图边缘与您将通过其动画窗口的屏幕边缘相同的大小。(例如,如果您要为底部的窗口设置动画,请使底部变大。)

    请注意,您希望图像视图的宽度和高度是固定的——<em>不是很大的。您将更改窗口的大小,但希望图像视图保持相同大小(并逐渐消失在窗口边缘下方)。

  6. 如果您更改了真实窗口的窗口级别,请将无边框窗口的窗口级别设置为匹配。
  7. 禁用屏幕更新。
  8. 无边框窗口排在真实窗口前面。
  9. 订购真正的窗户。
  10. 启用屏幕更新。
  11. 使用 NSViewAnimation 或 Core Animation 为无边框窗口的框架设置动画,将其原点更改为屏幕边缘的位置,并将相关轴上的框架大小降至零。保持另一个轴不变。例如,如果您要从右边缘设置动画,请将 x 原点更改为屏幕右边缘的 x 坐标,并将宽度更改为零,并保持 y 原点和高度不变。

    当您使用它时,您可能希望将窗口的动画设置alphaValue为零(NSViewAnimation 将此称为“FadeOut”效果)。试试看有没有这个,看看你喜欢哪种方式。

  12. 动画完成后,将无边框窗口排序并扔掉。
于 2013-05-28T00:31:36.003 回答