【发布时间】:2021-01-12 16:58:35
【问题描述】:
我用 NSMenuItem 实现了一个 NSMenu 并为其设置了自定义视图。当菜单可滚动时,鼠标悬停在 ▼ 按钮上滚动会导致某些 menuItem 消失(或无法正确绘制)。希望有人给我一些帮助。我会很感激的。
以下是有关此问题的视频: https://streamable.com/obrbon
这是我的代码:
private func setupMenuItemView(_ menu: NSMenu) {
let menuItemHeight: CGFloat = 20
let menuWidth = frame.width
let textFieldPadding: CGFloat = 10
for menuItem in menu.items {
guard !menuItem.title.isEmpty else { continue }
let menuItemView = MenuItemView(frame: NSRect(x: 0, y: 0, width: Int(menuWidth), height: menuItemHeight))
let textField = MenuItemTextField(labelWithString: menuItem.title)
textField.frame = NSRect(
x: textFieldPadding,
y: (menuItemView.frame.height-textField.frame.height)/2,
width: menuWidth-textFieldPadding*2,
height: textField.frame.height
)
textField.lineBreakMode = .byTruncatingTail
menuItemView.addSubview(textField)
menuItemView.toolTip = menuItem.title
menuItem.view = menuItemView
menuItem.target = self
menuItem.action = #selector(onMenuItemClicked(_:))
}
}
fileprivate class MenuItemView: NSView {
override func mouseUp(with event: NSEvent) {
guard let menuItem = enclosingMenuItem else { return }
guard let action = menuItem.action else { return }
NSApp.sendAction(action, to: menuItem.target, from: menuItem)
menuItem.menu?.cancelTracking()
}
override func draw(_ dirtyRect: NSRect) {
guard let menuItem = enclosingMenuItem else { return }
if menuItem.isHighlighted {
NSColor.alternateSelectedControlColor.set()
} else {
NSColor.clear.set()
}
NSBezierPath.fill(dirtyRect)
super.draw(dirtyRect)
}
}
fileprivate class MenuItemTextField: NSTextField {
override var allowsVibrancy: Bool {
return false
}
}
拨打setupMenuItemView() 后,我拨打menu.popup()。
希望这些信息对您有所帮助。
【问题讨论】:
-
您确定您的代码实现正确吗?调试项目似乎一次又一次地创建
-
编辑您的问题并发布您的代码。看看如何提供minimal reproducible example
-
抱歉,刚刚忘记发布我的代码。我编辑并发布了我的代码。希望对您有所帮助。
-
使用带有文本字段的 NSView 创建菜单有什么好处?使用 pullDown 选项将菜单添加到 NSPopUpButton 或使用 PopUpContextMenu 会更容易吗?
标签: swift cocoa appkit nsmenu nsmenuitem