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

时间:2013-10-23 03:30:37

标签: objective-c macos cocoa

我已经将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

Thants。

1 个答案:

答案 0 :(得分:2)

前段时间我遇到了同样的问题;原因是,只要您设置了跟踪区域,同时设置了“进入/退出”和“始终”选项,它就会停止可靠运行。我的 - 原则上非常粗糙 - 解决方案是在彼此之上创建两个跟踪区域,如下所示:

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];

这对我有用。

干杯!