7

我对 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

谢谢。

4

1 回答 1

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

这对我有用。

干杯!

于 2013-10-23T08:30:53.110 回答