Событие mouseEntered отключено, когда mouseDown (NSEvents Mac)

Я создал класс NSButton, и при перелистывании моих кнопок он с радостью обнаруживает события mouseEntered и mouseExited. Но как только происходит событие mouseDown, пока мышь нажата, события mouseEntered больше не вызываются до тех пор, пока кнопка мыши не будет поднята.

Итак, когда вызывается событие mouseDown, события mouseEntered или MouseExited больше не вызываются, а также mouseDown не вызывается при наведении на другие кнопки, пока я не отпущу начальный mouseDown.

Поэтому я хотел бы определить, когда моя мышь входит, когда мышь также не работает.


person Josh Kahane    schedule 19.07.2011    source источник


Ответы (3)


Оказывается, мне просто нужно было добавить NSTrackingEnabledDuringMouseDrag в мой NSTrackingAreaOptions. События mouseEntered и mouseExited теперь срабатывают при перетаскивании мышью вниз.

person Josh Kahane    schedule 19.07.2011
comment
Возможно, было бы неплохо упомянуть в своем вопросе, что вы использовали NSTrackingArea. - person jscs; 20.07.2011
comment
Это все еще помогло мне. - person charles; 15.07.2013
comment
Хм, это не работает для меня. Я использую NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways | NSTrackingEnabledDuringMouseDrag. - person Jordan H; 24.04.2018

Когда NSButton получает событие нажатия кнопки мыши, он входит в частный цикл отслеживания, обрабатывающий все события мыши, которые публикуются до тех пор, пока мышь не активируется. Вы можете настроить свой собственный цикл отслеживания, чтобы выполнять действия в зависимости от местоположения мыши:

- (void) mouseDown:(NSEvent *)event {

    BOOL keepTracking = YES;
    NSEvent * nextEvent = event;

    while( keepTracking ){

        NSPoint mouseLocation = [self convertPoint:[nextEvent locationInWindow]
                                          fromView:nil];
        BOOL mouseInside = [self mouse:mouseLocation inRect:[self bounds]];
        // Draw highlight conditional upon mouse being in bounds
        [self highlight:mouseInside];

        switch( [nextEvent type] ){
            case NSLeftMouseDragged:
                /* Do something interesting, testing mouseInside */
                break;
            case NSLeftMouseUp:
                if( mouseInside ) [self performClick:nil];
                keepTracking = NO;
                break;
            default:
                break;
        }

        nextEvent = [[self window] nextEventMatchingMask:NSLeftMouseDraggedMask | NSLeftMouseUpMask];
    }
}
person jscs    schedule 19.07.2011

Когда левая кнопка мыши нажата, начинается перетаскивание. Если я правильно помню, события перемещения мыши не отправляются во время перетаскивания, и это, вероятно, одна из причин, по которой вы не получаете сообщения mouseEntered и mouseExited. Однако, если вы реализуете протокол NSDraggingDestination и зарегистрируете свое представление в качестве возможного получателя типа перетаскиваемых данных, вместо этого вы получите сообщения draggingEntered и draggingExited.

Прочитайте об этом в Перетаскивание пунктов назначения раздела Темы программирования с помощью перетаскивания.

person Caleb    schedule 19.07.2011
comment
Я не совсем уверен, как это сделать. Все это очень сосредоточено на перетаскивании разных типов данных. Я не перетаскиваю никаких данных. Я просто хочу определить, когда мышь входит в новый вид (перетаскивается (мышь вниз) по nsbuttons). - person Josh Kahane; 20.07.2011