仅增加 window 高度,直到到达 Dock

Increase window height only until it reaches the Dock

我正在增加 NSWindow 的高度,但如果 window 的位置太靠下屏幕,window 的高度会增加并延伸到 Dock 下方。我想防止这种情况发生。

当我研究这个时,我偶然发现了 this question,它指出了相反的问题 - 他们说默认情况下它不会延伸到 Dock 下面,而他们想要它。也许这在 OS X Yosemite 中已经改变。无论如何,我想获得以下两种行为之一:

当 window 将在 Dock 下方延伸高度时,

  1. 调整大小应停止并导致 window 与 Dock 齐平,因此 window 高度小于所需高度,或者
  2. 应该继续调整大小,但是从 window 的顶部而不是底部调整大小,因此它不会在 Dock 下方并且仍然是预期的大小

这是 window 调整大小的触发方式:

[self.window setFrame:windowFrame display:YES animate:YES];

这发生在 AppDelegate,我没有覆盖 constrainFrameRect: toScreen:

另请注意,如果他们的 Dock 位于侧面并且 window 将超出可用屏幕 space。

,这也应该发生

菜单栏或 Dock 未占用的屏幕区域由 NSScreenvisibleFrame 属性 给定。

您也许应该覆盖 -constrainFrameRect:toScreen:。如果不是,您将在调用 -setFrame:... 之前调整 windowFrame。在后一种情况下,您可以从 window 的 screen 属性 中获取 NSScreen(假设您分配的帧没有将其移动到不同的屏幕).

您可能会使用这样的逻辑:

if (NSHeight(windowFrame) > NSHeight(screen.visibleFrame))
{
    windowFrame.origin.y = NSMinY(screen.visibleFrame);
    windowFrame.size.height = NSHeight(screen.visibleFrame);
}
else if (NSMinY(windowFrame) < NSMinY(screen.visibleFrame))
{
    windowFrame.origin.y = NSMinY(screen.visibleFrame);
}

if (NSWidth(windowFrame) > NSWidth(screen.visibleFrame))
{
    windowFrame.origin.x = NSMinX(screen.visibleFrame);
    windowFrame.size.width = NSWidth(screen.visibleFrame);
}
else if (NSMinX(windowFrame) < NSMinX(screen.visibleFrame))
{
    windowFrame.origin.x = NSMinX(screen.visibleFrame);
}
else if (NSMaxX(windowFrame) > NSMaxX(screen.visibleFrame))
{
    windowFrame.origin.x = NSWidth(screen.visibleFrame) - NSWidth(windowFrame);
}

如果您覆盖 -constrainFrameRect:toScreen:,那么您应该调用 super。您可以在进行调整并让它进一步约束后执行此操作,或者先调用它然后再对其返回的内容进行调整。