mouseEntered事件已禁用当mouseDown(NSEvents Mac)

Jos*_*ane 3 macos objective-c nsevent mouseevent nsbutton

我创建了一个NSButton类,当滚动我的按钮时,它很高兴地检测到mouseEntered和mouseExited事件.但是只要mouseDown事件发生,只要鼠标停止,鼠标按钮被抬起就不再调用mouseEntered事件.

因此,当调用mouseDown事件时,不再调用mouseEntered或MouseExited事件,也不会在滚动其他按钮时调用mouseDown,直到我放开了初始mouseDown.

因此,我想检测鼠标何时进入鼠标的时间.

希望你理解,并希望你能帮助阻止这一点.如果有更多细节会有所帮助,请告诉我.

Jos*_*ane 6

结果我只需要将NSTrackingEnabledDuringMouseDrag添加到我的NSTrackingAreaOptions.使用鼠标向下拖动时,mouseEntered和mouseExited事件现在会触发.


Jos*_*ell 5

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];
    }
}
Run Code Online (Sandbox Code Playgroud)