gpt4 book ai didi

macos - 丰富的、类似窗口的上下文菜单(如 Interface Builder)

转载 作者:行者123 更新时间:2023-12-03 17:47:46 24 4
gpt4 key购买 nike

我需要一个上下文菜单,其功能类似于在右键(control)单击 View 、 View Controller 等时 Interface Builder 所呈现的功能:

enter image description here

乍一看,它看起来像一个 NSPanel,其样式属性设置为“HUD Panel”,包含某种轮廓 View 。

窗口本身应该不难实现,但在右键(control)单击上显示上下文菜单的常用方法是重写该方法:

func menu(for event: NSEvent) -> NSMenu?

...它采用 NSMenu 作为返回值;无法传递 NSWindow/NSPanel

<小时/>

也许我可以做这样的事情:

override func menu(for event: NSEvent) -> NSMenu? {

// Create our popup window (HUD Panel) and present it
// at the location of event:

// (...actual code omitted...)

// Prevent any actual menu from being displayed:
return nil
}

...但感觉就像是黑客;我通过假装关心呈现实际的NSMenu(即,重写明确用于此目的的方法),但使用该时间来做不同的事情

我还需要放置一些逻辑来在用户单击其他位置时关闭窗口(上下文菜单内置了此功能)。

我认为子类化 NSMenuNSMenuItem 来获得上述行为和外观也是不可行的......

有更好的方法吗?有人知道(或能够猜测)Interface Builder 实际上是做什么的吗?

<小时/>

编辑: 正如@Willeke 的评论中所指出的,显示面板的条件与上下文菜单并不完全相同,因此它肯定不是一个。这意味着劫持上述方法来显示窗口不仅不优雅,而且是错误的。问题在于如何显示窗口(即检测静态、非拖动右键)。

最佳答案

您需要从 View 子类中覆盖 rightMouseDown(with:) 并使用它来触发显示面板。 NSView's implementation of that method是调用 menu(for:) 并显示返回的菜单的内容,因此您的自定义子类可以使用它来显示其自定义菜单面板,而不是调用 super。

为了与标准上下文菜单和 Interface Builder 中的菜单完全行为一致,您还需要通过覆盖 mouseDown(with:) 来处理 ctrl-left-clicks 并检查是否事件的 modifierFlags 包括 .control

关于macos - 丰富的、类似窗口的上下文菜单(如 Interface Builder),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45750375/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com