【问题标题】:An NSMenuItem's view (instance of an NSView subclass) isn't highlighting on hoverNSMenuItem 的视图(NSView 子类的实例)在悬停时未突出显示
【发布时间】:2010-05-27 00:14:43
【问题描述】:

我需要使用自定义NSView 子类来绘制一些内容,但是当用户悬停时它不会像突出显示的那样绘制,并且当用户单击它时它不会关闭NSMenu。有什么想法吗?

编辑

因此,使用-drawRect:[[self enclosingMenuItem] isHighlighted] 我能够判断是否需要将视图绘制为突出显示,并且有机会这样做。我所要弄清楚的是如何做到这一点。

【问题讨论】:

  • 通过后代,我认为您的意思是子类。
  • 我不想更改标题,因为链接会断开,但你是对的。
  • Alexsander Akers:链接不会中断,因为该网站实际上并不关注链接的标题部分。只有问题或答案编号才算数。也就是说:stackoverflow.com/questions/2917713/…

标签: objective-c cocoa highlight nsview nsmenuitem


【解决方案1】:

也许你应该这样尝试:

#define menuItem ([self enclosingMenuItem])

- (void) drawRect: (NSRect) rect {
    BOOL isHighlighted = [menuItem isHighlighted];
    if (isHighlighted) {
        [[NSColor selectedMenuItemColor] set];
        [NSBezierPath fillRect:rect];
    } else {
        [super drawRect: rect];
    }
}

【讨论】:

  • 我试过了,但是 [menuItem isHighlighted] 总是返回 NO(即使鼠标悬停在项目上)。我假设事件不会传播到 menuItem。我错过了什么?
  • @Mark:确保您的菜单项已实际启用。它需要为存在的选择器设置一个操作。您可以暂时将您的视图设置为 nil 以确保其他所有设置都正确。
【解决方案2】:

我不确定我是否理解您的问题。我认为你的意思是:菜单打开,你的所有图纸都停止了。我认为这是因为打开的 NSMenu 停止了 UI 的 NSRunLoop 线程。两者之一。您应该尝试在其他线程中进行绘图线程安全。

【讨论】:

    【解决方案3】:

    这对我有用。我使用堆栈视图。但这也适用于视图。

    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)
        } 
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      相关资源
      最近更新 更多