隐藏NSWindow的一部分(动画)

3
我有一个简单的任务需要对NSWindow进行动画处理,但我还是找不到完成它的方法。
我想隐藏一个窗口,通过将其超出屏幕边缘进行动画处理。但是,当连接两个显示器时,我的窗口只是移动到第二个监视器上。 有没有办法使窗口在主屏幕矩形区域内绘制,以便进行一些裁剪? 我在苹果文档中没有找到这样的内容。我知道有些UI效果是通过模拟所需行为的技巧来实现的。非常感谢任何信息!
我的第一个想法是创建一个新的窗口,并对次要屏幕内容进行快照。然后将我的主窗口滑动到此快照下方。但这是一种不好的方式 - 屏幕上的内容可能会动画(如视频)。
1个回答

5

你需要调整它的大小。

显然,调整实际窗口的大小是不可行的 - 你会因为副作用而调整所有视图的大小,并将任何视图调整为零通常会使其出现问题。

因此,你需要进行一些手法:

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

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

  6. 如果更改了真实窗口的窗口级别,请将无边框窗口的窗口级别设置为匹配。
  7. 禁用屏幕更新。
  8. 无边框窗口置于真实窗口前面。
  9. 真实窗口置于后面。
  10. 使用NSViewAnimation或Core Animation动画无边框窗口的框架,将其原点更改为该屏幕边缘的位置,并在相关轴上将框架大小减少到零。保留另一个轴。例如,如果您正在沿右侧边缘进行动画处理,请将x原点更改为屏幕右侧的x坐标,将宽度更改为零,并保持y原点和高度不变。

    顺便说一下,您可能希望将窗口的alphaValue动画降至零(NSViewAnimation将其称为“FadeOut”效果)。尝试使用此功能并查看您喜欢哪种方式。

  11. 动画完成后,将无边框窗口排除并丢弃。

感谢@Peter!您的答案非常详细。我会接受它,因为许多用户会发现它非常有帮助。但是我在我的情况下找到了更好的解决方案:与其解决绘图问题,我不如将窗口移动到最左/最上/最右屏幕。我可以看到所有其他隐藏在屏幕外的应用程序都采用了相同的方法。无论如何,非常感谢! - UJey
@UJey:你所说的“将我的窗口移动到最左/上/右边的屏幕”,是什么意思?这不就是你试图解决的问题吗? - Peter Hosey
当你有两个屏幕时,总会有一个边缘位于两个屏幕之间。而我的窗口位置就在主显示器上,但是在两个屏幕之间。这导致了在另一个显示器上窗口可见性的问题。现在,假设我的第二个屏幕在主屏幕的右侧。我的窗口应该隐藏在右侧屏幕边缘之外。所以我把我的窗口移动到次右侧屏幕的右边缘,而不是放在主屏幕的右边界。啊,我的话可能有点混乱,但我想你已经明白了我的意思。 - UJey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接