У меня есть приложение для воспроизведения видео, в котором отображается 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. Я также не перетаскиваю мышь, просто перемещая ее в обычном режиме.
Спасибо, но, к сожалению, это та же проблема. Я могу заставить его работать, если я медленно перемещаю мышь, но если я быстро его погуляю, он останавливается, пока я не остановлю его внутри области, а затем снова начну двигаться медленно. – mwoods
@mwoods: Ответ правильный, к сожалению, неправильный «NSTrackingAreaOptions» для вашего дела. – Leandros