【发布时间】:2020-12-08 13:04:58
【问题描述】:
NSMenu 对象是否可以在关闭之前而不是之后通知?它的委托有方法 didClose(_:) 但我想在它真正关闭之前更新它的项目,因为消失的动画太长了,眼睛可以看到变化。
我试图监控 NSEvents,但它没有用,因为 NSMenu 没有包含其 NSWindow 对象的公共属性。
理论上可以通过为每个菜单项创建自定义 NSViews 来实现。但我不喜欢这样,因为那样我将不得不绘制项目的所有绘图,包括选择和点击动画。
更新: 我尝试将 NSPopUpButton 子类化以跟踪菜单更新:
class CustomPopUpButton: NSPopUpButton {
var isMenuShown: Bool = false
var onClosingMenu: ((NSMenu)->())?
override var needsDisplay: Bool {
willSet {
if let menu = self.menu, isMenuShown, newValue {
onClosingMenu?(menu)
isMenuShown = false
}
}
}
override func willOpenMenu(_ menu: NSMenu, with event: NSEvent) {
isMenuShown = true
super.willOpenMenu(menu, with: event)
}
}
我并不为那段代码感到自豪,但它通常可以工作。然而,'onClosingMenu' 方法在菜单关闭动画完成后被调用。以前没有。
我想要实现的视频:https://drive.google.com/file/d/1GAceKp-fTlurxSybdB3h0epVZrtQjthm/view?usp=sharing
【问题讨论】:
-
我认为你可以尝试在
NSMenu.willSendActionNotification处理程序中做你想做的事,因为一旦发送任何项目操作,菜单就会关闭。 -
只有当用户点击一个项目时才有效。但是可以通过单击菜单外部或按 Esc 键来关闭菜单。我坚持这一点:(
-
不清楚你想实现什么。 NSMenu 有自己的验证/更新流程,那么有什么问题?
-
我想显示系统中可用字体的选择器。比方说,就像在 Apple Pages 中一样。在该应用程序中,带有可用字体的 NSMenu 的 NSPopupButton 正在根据菜单显示状态更改所选项目的显示选项。如果显示菜单,则所选项目具有 NSAttrbiutedString 标题。但是在菜单关闭之前,它会删除属性,当菜单关闭时,您会看到正常的按钮字体,即默认字体。我能够模仿这种行为,除了关闭菜单时的标题更新。我在 didClose 方法中这样做,并且标题字体的更改太明显了
-
我还是不明白你想要完成什么。