仅在窗口高度到达Dock时增加窗口高度

时间:2015-04-07 21:47:26

标签: macos cocoa nswindow

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

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

当窗口将在Dock下方延伸时,

  1. 调整大小应停止并使窗口与Dock齐平,因此窗口高度低于所需的值,或
  2. 应该继续调整大小,但是从窗口顶部而不是从底部调整大小,因此它不会在Dock下面,仍然是预期的大小
  3. 这是触发窗口大小调整的方式:

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

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

    另请注意,如果Dock位于侧面且窗口超出可用屏幕空间,也会出现这种情况。

1 个答案:

答案 0 :(得分:2)

未被菜单栏或Dock占用的屏幕区域由visibleFrame的{​​{1}}属性提供。

你可能应该覆盖NSScreen。如果没有,则在调用-constrainFrameRect:toScreen:之前调整windowFrame。在后一种情况下,您可以从窗口的-setFrame:...属性中获取NSScreen(假设您指定的帧未将其移动到其他屏幕)。

你可以使用这样的逻辑:

screen

如果你覆盖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); } ,那么你应该打电话给super。您可以在进行调整后进行调整并进一步限制,或先调用它,然后对其返回的内容进行调整。