NSTrackingArea工作奇怪 - 整个视图,或什么都没有......没有任何矩形受到尊重

时间:2010-11-09 17:36:46

标签: cocoa macos

在视图的“InitWithFrame”方法中,我正在设置一个跟踪区域,我想捕获鼠标进入/退出事件。
我的问题有两个:

  1. 如果没有NSTrackingInVisibleRect,则根本不会调用事件。
  2. 无论我把它放在什么“矩形”上,一个覆盖整个视图的框架或一个只占据它的一小部分的框架 - 无论鼠标光标在哪里,都会为整个视图调用鼠标进入/退出事件在观点上。
  3. 这是我初始化跟踪区域的方式:

    trackingArea = [[NSTrackingArea alloc] initWithRect:rect
      options: (NSTrackingMouseEnteredAndExited | NSTrackingInVisibleRect | NSTrackingActiveAlways )
      owner:self userInfo:nil];
    [self addTrackingArea:trackingArea];
    

    为什么会发生这种情况的任何线索?我希望只为我视图的一小部分(底部)调用鼠标进入/退出事件。

2 个答案:

答案 0 :(得分:5)

Mike Abdullah的回答解释了第2点。

以下是关于在不使用NSTrackingInVisibleRect标志时根本没有收到事件的猜测:
您提供的变量rect可能不在视图的坐标系中。您可以使用以下代码作为NSView子类的指定初始值设定项,以接收视图整个区域的mouseEntered:mouseExited:事件:

- (id)initWithFrame:(NSRect)frame 
{
    if ((self = [super initWithFrame:frame])) 
    {
        //by using [self bounds] we get our internal origin (0, 0)
        NSTrackingArea* trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] options:(NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways) owner:self userInfo:nil];
        [self addTrackingArea:trackingArea];
        [trackingArea release];
    }
    return self;
}

Apple的documentation说:

  

创建跟踪区域对象时,   你指定一个矩形(在视图中)   坐标系),...

答案 1 :(得分:3)

直接来自NSTrackingInVisibleRect的文档:

  

NSTrackingArea对象会自动与视图可见区域(visibleRect)中的更改同步,并忽略从rect返回的值。