2014-11-20 4 views
1

У меня есть приложение для воспроизведения видео, в котором отображается NSView, отслеживается координатами мыши, чтобы показать позицию времени, когда пользователь наводится на определенную область.NSView mouseMoved событие иногда не срабатывает

Это работает отлично в 70% случаев, однако он часто не срабатывает вообще. Время, когда это, скорее всего, произойдет, похоже, при первом вводе мыши в представление и после зависания мыши за пределами области, а затем снова внутри.

Код внутри подкласса NSView выглядит следующим образом:

- (void)viewDidMoveToWindow 
{ 
    if ([self window]) { 
     [self resetTrackingRect]; 
    } 
} 

- (void)clearTrackingRect 
{ 
    if (rolloverTrackingRectTag > 0) 
    { 
     [self removeTrackingRect:rolloverTrackingRectTag]; 
     rolloverTrackingRectTag = 0; 
    } 
} 

- (void)resetTrackingRect 
{ 
    [self clearTrackingRect]; 
    rolloverTrackingRectTag = [self addTrackingRect:[self visibleRect] 
              owner:self userData:NULL assumeInside:NO]; 
} 

- (void)resetCursorRects 
{ 
    [super resetCursorRects]; 
    [self resetTrackingRect]; 
} 

- (void)mouseEntered:(NSEvent *)theEvent 
{ 
    // Only ask for mouse move events when inside rect because they are expensive 
    [[self window] setAcceptsMouseMovedEvents:YES]; 
    [[self window] makeFirstResponder:self]; 

    // Tells the observer to show the time view 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"MWTimelineHover" object:self userInfo:[NSDictionary dictionaryWithObjectsAndKeys:theEvent,@"event",nil]]; 
} 

- (void)mouseExited:(NSEvent *)theEvent 
{ 
    [[self window] setAcceptsMouseMovedEvents:NO]; 
    [[self window] resignFirstResponder]; 

    // Tells the observer to hide the time view 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"MWTimelineHoverLeave" object:self]; 
} 

- (void)mouseMoved:(NSEvent *)theEvent 
{ 
    [super mouseMoved:theEvent]; 

    // Tells the observer to show the time view 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"MWTimelineHover" object:self userInfo:[NSDictionary dictionaryWithObjectsAndKeys:theEvent,@"event",nil]]; 
} 

Примечание: в случаях, когда она глохнет, mouseExited не называется, и вид не потерял статус firstResponder. Я также не перетаскиваю мышь, просто перемещая ее в обычном режиме.

ответ

2

Вам необходимо использовать NSTrackingArea. Вот ссылка NSTrackingArea Class Reference.

- (void)commonInit { 
    CGRect rect = CGRectMake(0.0f, 0.0f, self.frame.size.width, self.frame.size.height); 
    NSTrackingAreaOptions options = NSTrackingActiveInKeyWindow | NSTrackingMouseMoved | NSTrackingInVisibleRect; 
    _trackingArea = [[NSTrackingArea alloc] initWithRect:rect options:options owner:self userInfo:nil]; 
    [self addTrackingArea:_trackingArea]; 
} 

Надеюсь, это поможет вам.

+0

Спасибо, но, к сожалению, это та же проблема. Я могу заставить его работать, если я медленно перемещаю мышь, но если я быстро его погуляю, он останавливается, пока я не остановлю его внутри области, а затем снова начну двигаться медленно. – mwoods

+0

@mwoods: Ответ правильный, к сожалению, неправильный «NSTrackingAreaOptions» для вашего дела. – Leandros

Смежные вопросы