NSMenuItem 中自定义视图上的 NSTackingRect 并不总是触发 mouseExited 事件



我已经子类化了NSView,并使用以下内容创建了一个NSTrackingArea:

-(void)setUpTrackingArea
{
    if(trackingArea != nil)
    {
        [self removeTrackingArea:trackingArea];
    }
    int opts = (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways | NSTrackingEnabledDuringMouseDrag);
    trackingArea = [ [NSTrackingArea alloc] initWithRect:[self bounds] options:opts owner:self userInfo:nil];
    [self addTrackingArea:trackingArea];
    NSLog(@"update tracking area %@", trackingArea);
    NSPoint mouseLocation = [[self window] mouseLocationOutsideOfEventStream];
    mouseLocation = [self convertPoint: mouseLocation   fromView: nil];
    if (NSPointInRect(mouseLocation, [self bounds]))
    {
        [self mouseEntered: nil];
    }
    else
    {
        [self mouseExited: nil];
    }
}

我也在覆盖:

- (void)mouseEntered:(NSEvent *)theEvent
- (void)mouseExited:(NSEvent *)theEvent

设置突出显示属性,然后调用

[self setNeedsDisplay:YES];

它调用 drawrect 以突出显示菜单视图,就像您期望菜单一样。

问题是鼠标退出事件似乎并不总是触发,在鼠标移开后突出显示一些自定义视图。

知道我做错了什么吗?

我创建了一个演示项目来解决这个问题。

见 https://github.com/antokne/APGCustomMenuItemView

嗡。

前段时间我遇到了同样的问题;原因是一旦您有一个同时设置了"进入/退出"和"始终"选项的跟踪区域,它就会停止可靠地工作。我的 - 诚然非常粗糙 - 解决方案是像这样在彼此之上创建两个跟踪区域:

NSTrackingArea *mouseOverTracker = [[NSTrackingArea alloc] initWithRect:self.view.bounds options:(NSTrackingActiveAlways|NSTrackingMouseMoved) owner:self userInfo:nil];
NSTrackingArea *mouseOverTracker2 = [[NSTrackingArea alloc] initWithRect:self.view.bounds options:(NSTrackingMouseEnteredAndExited|NSTrackingActiveAlways) owner:self userInfo:nil];
[self.view addTrackingArea:mouseOverTracker];
[self.view addTrackingArea:mouseOverTracker2];

这对我有用。

干杯!

最新更新