【问题标题】:How do I prevent the menu bar from moving down when my popover is open?当我的弹出窗口打开时,如何防止菜单栏向下移动?
【发布时间】:2018-04-18 05:01:12
【问题描述】:

我有一个带有弹出框的应用,它出现在状态栏项目上。问题是,当您在全屏应用程序中单击图标时,然后将鼠标从菜单栏移​​开以单击弹出窗口中的某些内容,菜单栏向上移动,弹出窗口也是如此。很烦人。

有人知道解决这个问题的方法吗?我尝试在弹出窗口中附加一个不可见的菜单,但我无法使该菜单不可见。

为了清楚起见,屏幕截图,烦人的部分是我挥动鼠标的地方:

【问题讨论】:

  • 顺便说一句 - 你不仅会在全屏时遇到这个问题。在 10.11 上,可以始终自动隐藏菜单栏:tekrevue.com/tip/hide-menu-bar-os-x-el-capitan
  • 你可能想看看这个主题,听起来像是一个干净的解决方案:stackoverflow.com/questions/35008501/…
  • 不幸的是,这个问题的答案对我的情况没有多大帮助。我设法得到的最好结果是检测菜单栏何时变得隐藏或再次可见。

标签: cocoa fullscreen menubar nspopover


【解决方案1】:

popover 窗口正在移动,因为它的父窗口是状态项窗口,并且当父窗口移动时,子窗口也随之移动。 (在我研究这个之前,我什至不知道 Cocoa 有父窗口和子窗口。)我在显示弹出框后立即用这段代码解决了问题:

NSWindow *popoverWindow = self.popup.contentViewController.view.window;
[popoverWindow.parentWindow removeChildWindow:popoverWindow];

现在,菜单栏仍然向上移动,但至少弹出窗口保持在原来的位置。

【讨论】:

  • 弄乱你不拥有的窗户......如果我是你,就不会走那条路。从自找麻烦的经验来看,很容易与即将发布的操作系统版本(甚至比您测试过的操作系统版本更旧)中断
  • @cacau 有更好的主意吗?
  • 我发现的唯一其他解决方案是在菜单栏隐藏时分离弹出框(请参阅github.com/lukaskubanek/DetachablePopoverExample 分离弹出框)
【解决方案2】:

要么使用Carbon events,要么观察菜单栏发生的事情(NSStatusBarWindow 类型的窗口):

通知类型

  • NSWindowDidChangeOcclusionStateNotification
  • NSWindowDidMoveNotification
  • NSWindowWillCloseNotification
  • NSWindowDidCloseNotification

使用NSStatusBarWindow 类的对象应该为您提供有关菜单栏显示或隐藏的足够信息,以添加适当的处理。

【讨论】:

  • 正确的处理方式是什么?困难的部分不是找出状态项何时移动,而是阻止弹出窗口移动。
【解决方案3】:

超级hacky方法:

具有一些超高窗口级别的自定义窗口,使其显示在菜单栏上,然后向新窗口添加一个透明的自定义视图,根据您的需要捕获并处理/阻止鼠标点击。

或者:

获取弹出框用来显示和跟踪/处理NSWindowWillMoveNotification/NSWindowDidMoveNotification的窗口实例。

【讨论】:

  • 不是我的问题,添加截图澄清。
  • 啊,对了!菜单栏隐藏时发送的任何通知?试着听听任何东西,特别注意developer.apple.com/library/mac/documentation/General/…中提到的那些
  • 如果有任何本地通知发送,它们将是全屏的程序。可能会有一个分布式通知,但我能做些什么呢?隐藏弹出窗口?这将导致无法在全屏模式下使用弹出窗口。
  • ..AppKit 一直发送大量通知,值得一试。没有为您的窗口调用委托方法?对于应用的菜单栏?
  • @tbodt 或者只是注意弹出窗口的移动(请参阅上面的更改答案)
【解决方案4】:

我将@tbodt 的答案转换为 Swift 4 并确认可以解决此问题:

let popoverWindow = popup.contentViewController.view.window as? NSWindow
popoverWindow?.parent?.removeChildWindow(popoverWindow!)

【讨论】:

  • 正如 cacau 所说,弄乱内部窗口并不是一个好主意。为什么不在应该显示弹出框时在状态栏项目附近放置一个小的隐藏窗口,并将其与隐藏窗口中的视图相关联。几年前我使用这种技术来防止打开动画期间的闪烁。您可以使用不同的弹出框行为,对我来说,将其从父窗口中删除可能会产生副作用。
  • @MarcT。你会这么好心并提供一个代码sn-p吗?我正在处理类似的问题,但没有完全理解您的意思。
  • 我也很想看看这个例子。我希望弹出框跟随菜单栏向上,但在到达屏幕顶部时停止,这样弹出框不会被切断。
猜你喜欢
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 2010-11-20
  • 2016-01-26
相关资源
最近更新 更多