【问题标题】:Hide a portion of NSWindow (animation)隐藏 NSWindow 的一部分(动画)
【发布时间】:2013-05-28 08:37:45
【问题描述】:

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

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

有什么办法可以对窗口进行一些剪辑,只在主屏幕矩形区域绘制?

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

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

【问题讨论】:

    标签: cocoa animation window hide


    【解决方案1】:

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

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

    所以,你需要做一些花招:

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

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

    6. 如果您更改了实际窗口的窗口级别,请将无边框窗口的窗口级别设置为匹配。
    7. Disable screen updates.
    8. Order无边框窗口in front of真实窗口。
    9. Order out真正的窗口。
    10. Enable screen updates.
    11. 使用 NSViewAnimation 或 Core Animation 为无边框窗口的框架设置动画,将其原点更改为屏幕边缘的位置,并将相关轴上的框架大小降至零。保持另一个轴不变。例如,如果您要在右边缘设置动画,请将 x 原点更改为屏幕右边缘的 x 坐标,并将宽度更改为零,并保持 y 原点和高度不变。

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

    12. 动画完成后,将无边框窗口取出并扔掉。

    【讨论】:

    • 谢谢@Peter!你的回答很详细。我接受它是因为很多用户会觉得它很有帮助。但我为我的情况找到了一个更好的解决方案:与其解决绘图问题,不如将我的窗口移到最左/上/右屏幕。我可以看到所有其他将自己隐藏在屏幕之外的应用程序都实现了相同的方法。不过还是非常感谢!
    • @UJey:“将我的窗口移到最左/最上/最右的屏幕”是什么意思?这不是您要解决的问题吗?
    • 当你有 2 个屏幕时,你总是有一个位于屏幕之间的边缘。这就是我的窗口的位置——在主显示屏上,但在屏幕之间。它导致另一个显示器上的窗口可见性问题。现在,假设我的辅助屏幕位于主屏幕的右侧。我的窗口应该隐藏在右侧屏幕边缘之外。所以我说我将窗口移动到最右边(辅助)屏幕的右边缘,而不是放在主屏幕的右边框。啊,我的话很混乱,但我想你已经明白了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    相关资源
    最近更新 更多