隐藏 NSWindow 的一部分(动画)

UJe*_*Jey 3 cocoa animation window hide

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

我有一个窗口,我想通过将其动画设置到屏幕边缘之外来隐藏它。但连接两个显示器后,我的窗口只需移动到第二个显示器即可。

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

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

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

Pet*_*sey 5

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

\n\n

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

\n\n

所以,你需要施展一些技巧:

\n\n
    \n
  1. 截取窗口的屏幕截图。
  2. \n
  3. 创建一个无边框窗口,其框架大小与该图像的大小完全相同。(不要使用真实窗口的框架\xe2\x80\x94,它不会包含阴影。)
  4. \n
  5. 创建一个 NSView 作为无边框窗口的内容视图。
  6. \n
  7. 创建一个图像视图并将其放入内容视图中。
  8. \n
  9. 将图像视图的大小设置autoresizingMask为与要通过动画显示窗口的屏幕边缘相同的视图边缘。(例如,如果您要将窗口从底部设置为动画,请使底部足够大。)

    \n\n

    请注意,您希望图像视图的宽度和高度是固定的\xe2\x80\x94 not ssized。您将更改窗口的大小,但希望图像视图保持相同的大小(并逐渐消失在窗口边缘下方)。

  10. \n
  11. 如果您更改了真实窗口的窗口级别,请将无边框窗口的窗口级别设置为匹配。
  12. \n
  13. 禁用屏幕更新。
  14. \n
  15. 将无边框窗口排列真实窗口的前面。
  16. \n
  17. 订购真正的窗口。
  18. \n
  19. 启用屏幕更新。
  20. \n
  21. 使用 NSViewAnimation 或 Core Animation 对无边框窗口的框架进行动画处理,将其原点更改为屏幕边缘的位置,并将相关轴上的框架大小减小为零。保持另一个轴不变。例如,如果要在右边缘设置动画,请将 x 原点更改为屏幕右边缘的 x 坐标,将宽度更改为零,并保持 y 原点和高度不变。

    \n\n

    当您使用它时,您可能希望将窗口的动画效果alphaValue降至零(NSViewAnimation 将此称为 \xe2\x80\x9cFadeOut\xe2\x80\x9d 效果)。尝试一下有没有这个,看看你喜欢哪种方式。

  22. \n
  23. 动画完成后,将无边框窗口命令出去并扔掉。
  24. \n
\n