我需要使用自定义NSView
子类来绘制一些内容,但是当用户悬停时它不会像突出显示的那样绘制,并且NSMenu
当用户单击它时它不会关闭。有任何想法吗?
编辑
所以使用-drawRect:
并且[[self enclosingMenuItem] isHighlighted]
我能够判断我是否需要将视图绘制为突出显示并且有机会这样做。我所要弄清楚的是如何做到这一点。
我需要使用自定义NSView
子类来绘制一些内容,但是当用户悬停时它不会像突出显示的那样绘制,并且NSMenu
当用户单击它时它不会关闭。有任何想法吗?
所以使用-drawRect:
并且[[self enclosingMenuItem] isHighlighted]
我能够判断我是否需要将视图绘制为突出显示并且有机会这样做。我所要弄清楚的是如何做到这一点。
也许你应该这样尝试:
#define menuItem ([self enclosingMenuItem])
- (void) drawRect: (NSRect) rect {
BOOL isHighlighted = [menuItem isHighlighted];
if (isHighlighted) {
[[NSColor selectedMenuItemColor] set];
[NSBezierPath fillRect:rect];
} else {
[super drawRect: rect];
}
}
我不确定我是否理解你的问题。我认为你的意思是:菜单打开,你的所有图纸都停止了。我认为这是因为打开的 NSMenu 停止了 UI 的 NSRunLoop 线程。两者之一。您应该尝试在其他线程中进行绘图线程安全。
这对我有用。我使用堆栈视图。但这也适用于视图。
class MenuStackView: NSStackView {
override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
let menuItem = self.enclosingMenuItem
let isHighlighted = menuItem?.isHighlighted ?? false
if isHighlighted {
NSColor.selectedMenuItemColor.set()
NSBezierPath.fill(dirtyRect)
}
}
}