我制作了一个名为Uberlayer的应用程序。用户可以使用这个单一用途的 Mac 应用程序将图像叠加在其他应用程序之上。
我正在使用setMovableByWindowBackground
它的背景来拖动整个窗口。
我想做一点改进,因为应用程序现在不能将窗口拖到高于菜单栏的位置,这可能有点烦人。对于普通窗口,我可以想象将它锁定到菜单栏是一件好事,但对于这个用例来说,能够将它拖得更高是一件好事。
任何人都知道如何更改此默认窗口行为?
我制作了一个名为Uberlayer的应用程序。用户可以使用这个单一用途的 Mac 应用程序将图像叠加在其他应用程序之上。
我正在使用setMovableByWindowBackground
它的背景来拖动整个窗口。
我想做一点改进,因为应用程序现在不能将窗口拖到高于菜单栏的位置,这可能有点烦人。对于普通窗口,我可以想象将它锁定到菜单栏是一件好事,但对于这个用例来说,能够将它拖得更高是一件好事。
任何人都知道如何更改此默认窗口行为?
而是使用这样的-setMovableByWindowBackground:
覆盖-mouseDown:
事件:
- (void)mouseDown:(NSEvent *)event
{
NSPoint originalMouseLocation = [window convertBaseToScreen:[event locationInWindow]];
NSRect originalFrame = [window frame];
while (YES)
{
NSEvent *newEvent = [window nextEventMatchingMask:(NSLeftMouseDraggedMask | NSLeftMouseUpMask)];
if ([newEvent type] == NSLeftMouseUp)
{
break;
}
NSPoint newMouseLocation = [window convertBaseToScreen:[newEvent locationInWindow]];
NSPoint delta = NSMakePoint(
newMouseLocation.x - originalMouseLocation.x,
newMouseLocation.y - originalMouseLocation.y);
NSRect newFrame = originalFrame;
newFrame.origin.x += delta.x;
newFrame.origin.y += delta.y;
[window setFrame:newFrame display:YES animate:NO];
}
}
** 不要忘记隐藏窗口的标题栏(选择窗口-> 转到Attributes Inspector -> 取消选中标题栏),因为它的窗口不能高于菜单栏。或者其他解决方案是创建无边框窗口。
我只是添加到贾斯汀的答案。您需要在使用 Justin 的-mouseDown:
代码时设置其级别。
[window setLevel:NSMainMenuWindowLevel];
如果窗口的级别低于NSMainMenuWindowLevel
它将无法工作。NSStatusWindowLevel
如果您希望窗口位于状态栏上方,您可以将其设置为。