将NSWindow置于屏幕顶部,没有1像素边距。

时间:2016-03-05 01:30:39

标签: swift macos cocoa nswindow nsmenu

我试图使用NSWindow来模拟NSMenu的行为。但是,当我尝试将窗口固定在状态项(位于屏幕顶部)下方时,我意识到默认情况下所有窗口在窗口顶部和状态栏之间都有1个像素的边距。这就是我的意思: NSWindow at top of screen with unintended margin

我在github上发现了一个过时的实现,它设法在状态栏下面创建一个没有这个边距的自定义窗口,但是我很难弄清楚实现是如何实现的。 https://github.com/SquaredTiki/JGMenuWindow

如何摆脱边距,使窗口贴合状态栏?

2 个答案:

答案 0 :(得分:2)

找到解决方案!

override func constrainFrameRect(frameRect: NSRect, toScreen screen: NSScreen?) -> NSRect {
    return frameRect
}

覆盖您的NSWindow子类。现在,您可以以任何方式移动您的NSWindow,它将能够超越菜单栏。这是因为通常在移动窗口之前调用该函数以检查所提出的新窗口位置是否使其顶部边缘位于屏幕上。如果不是这种情况,该功能将返回一个调整位置,其中顶边位于屏幕上。通过重写此函数并返回frameRect,您不会对新建议的窗口位置进行任何检查或重新调整,而是告诉它可以移动到任何地方的窗口。

答案 1 :(得分:0)

您似乎尝试附加"菜单"到NSStatusItem。您是否有理由不实际附加菜单并将相应的NSMenuItem视图设置为您想要的样子? Apple在这里有一个例子:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MenuList/Articles/ViewsInMenuItems.html