JasonGenX
JasonGenX

Reputation: 5434

NSTrackingArea works weird - Entire View, or nothing... no rectangles respected

In my "InitWithFrame" method of a view I'm setting a tracking area for which I want to capture mouse enter/exit events.
My problems are two fold:

  1. Without NSTrackingInVisibleRect the events won't be called at all.
  2. No matter what "rect" I put it, one that covers the entire view's frame or one that occupies just a small portion of it - the mouse enter/exited events are called for the entire view, regardless of where the mouse cursor is on the view.

this is how I initialize the tracking area:

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

Any clues why this happens? I want the mouse enter/exit events to be called only for a small portion (the bottom part) of my view.

Upvotes: 1

Views: 2465

Answers (2)

Thomas Zoechling
Thomas Zoechling

Reputation: 34243

Mike Abdullah's answer explains point 2.

Here is a guess about why you don't receive events at all when not using the NSTrackingInVisibleRect flag:
Probably the variable rect you provide is not within the view's coordinate system. You could use the following code as the designated initializer of your NSView subclass to receive mouseEntered: and mouseExited: events for the whole area of your view:

- (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's documentation says:

When creating a tracking-area object, you specify a rectangle (in the view’s coordinate system), ...

Upvotes: 5

Mike Abdullah
Mike Abdullah

Reputation: 15003

Straight from the docs for NSTrackingInVisibleRect:

The NSTrackingArea object is automatically synchronized with changes in the view’s visible area (visibleRect) and the value returned from rect is ignored.

Upvotes: 4

Related Questions