当事件进入子视图时,如何在无边框窗口上启动用户鼠标驱动的移动或调整OS X 10.8+上的自定义窗口边框?

时间:2016-10-31 20:02:44

标签: objective-c macos cocoa

我有一个无边框窗口,其唯一的子视图始终是窗口的大小(受自动布局约束),是第三方组件。该组件希望能够在某些区域发生mouseDown:时通知我,以告知操作系统启动用户驱动的移动或调整窗口大小(就好像它不是& #39; t无边框)。它还想决定要使用的操作(移动或调整大小)。最后一部分是因为在我运行此代码的所有其他操作系统上,我必须指定这些操作。 (如果有必要,我可以更改触发此类事件的规则,或者如何更改;这取决于必要的更改。)

我知道将窗口设置为可从后台移动,但我需要掌控移动何时发生。它也不处理调整大小。

我知道-[NSWindow performWindowDragWithEvent:],但有两个问题:

  • 仅适用于10.11;我需要10.8或更新
  • 它不允许我指定要执行的移动操作的类型

我可以实现自己的循环,但是这导致了如何查询窗口的约束最小和最大大小的自动布局的问题。我在NSWindow看不到任何方法;只有设置自己的最小和最大尺寸的方法...另外,我需要知道如何处理某些边缘情况。例如,如果有两个垂直排列的监视器,其间有菜单栏,鼠标在拖动时穿过菜单栏,会发生什么?

There is sample code on Apple about moving,但它没有处理调整大小,也没有考虑边缘情况。

我还可以看看GTK +或Qt做什么......

或者我还缺少其他选择吗?

感谢。

1 个答案:

答案 0 :(得分:2)

为了从自动布局确定窗口大小的限制,我认为您可以临时将高度和宽度约束添加到内容视图。首先,使约束尝试使视图在优先级NSLayoutPriorityDragThatCanResizeWindow处为零大小(510)。然后,在视图上调用-fittingSize。然后更改约束,以便他们尝试使视图非常大并重复。然后,删除约束。

我不认为窗口或视图会因为这些限制而实际调整大小,除非您调用-layout...方法。如有必要,您可能需要记录窗口的原始帧并在测量后恢复。您可以在整个过程中禁用屏幕更新,以避免任何UI闪烁/闪烁。

对于其他的东西,我认为你只需要手动完成。尽可能使用-performWindowDragWithEvent:(移动,10.11+)。您只需要进行实验以确定边缘情况的行为并进行复制。