仅增加 window 高度,直到到达 Dock
Increase window height only until it reaches the Dock
我正在增加 NSWindow
的高度,但如果 window 的位置太靠下屏幕,window 的高度会增加并延伸到 Dock 下方。我想防止这种情况发生。
当我研究这个时,我偶然发现了 this question,它指出了相反的问题 - 他们说默认情况下它不会延伸到 Dock 下面,而他们想要它。也许这在 OS X Yosemite 中已经改变。无论如何,我想获得以下两种行为之一:
当 window 将在 Dock 下方延伸高度时,
- 调整大小应停止并导致 window 与 Dock 齐平,因此 window 高度小于所需高度,或者
- 应该继续调整大小,但是从 window 的顶部而不是底部调整大小,因此它不会在 Dock 下方并且仍然是预期的大小
这是 window 调整大小的触发方式:
[self.window setFrame:windowFrame display:YES animate:YES];
这发生在 AppDelegate
,我没有覆盖 constrainFrameRect: toScreen:
。
另请注意,如果他们的 Dock 位于侧面并且 window 将超出可用屏幕 space。
,这也应该发生
菜单栏或 Dock 未占用的屏幕区域由 NSScreen
的 visibleFrame
属性 给定。
您也许应该覆盖 -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。您可以在进行调整并让它进一步约束后执行此操作,或者先调用它然后再对其返回的内容进行调整。
我正在增加 NSWindow
的高度,但如果 window 的位置太靠下屏幕,window 的高度会增加并延伸到 Dock 下方。我想防止这种情况发生。
当我研究这个时,我偶然发现了 this question,它指出了相反的问题 - 他们说默认情况下它不会延伸到 Dock 下面,而他们想要它。也许这在 OS X Yosemite 中已经改变。无论如何,我想获得以下两种行为之一:
当 window 将在 Dock 下方延伸高度时,
- 调整大小应停止并导致 window 与 Dock 齐平,因此 window 高度小于所需高度,或者
- 应该继续调整大小,但是从 window 的顶部而不是底部调整大小,因此它不会在 Dock 下方并且仍然是预期的大小
这是 window 调整大小的触发方式:
[self.window setFrame:windowFrame display:YES animate:YES];
这发生在 AppDelegate
,我没有覆盖 constrainFrameRect: toScreen:
。
另请注意,如果他们的 Dock 位于侧面并且 window 将超出可用屏幕 space。
,这也应该发生菜单栏或 Dock 未占用的屏幕区域由 NSScreen
的 visibleFrame
属性 给定。
您也许应该覆盖 -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。您可以在进行调整并让它进一步约束后执行此操作,或者先调用它然后再对其返回的内容进行调整。