我已经创建了一个NSButton类,当滚动到我的按钮时,它愉快地检测到mouseEntered和mouseExited事件。但是一旦mouseDown事件发生,只要鼠标按下,mouseenter事件就不再被调用,直到鼠标按钮被解除。
因此,当调用mouseDown事件时,不再调用mouseenter或MouseExited事件,在滚动到其他按钮时也不会调用mouseDown,直到我放开初始的mouseDown。
所以我想检测当我的鼠标进入,而鼠标是向下的
原来我只需要添加NSTrackingEnabledDuringMouseDrag到我的NSTrackingAreaOptions。鼠标向下拖动时触发mouseenter和mouseexit事件
当一个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];
}
}
当鼠标左键按下时,拖动开始。如果我没记错的话,鼠标移动事件不会在拖拽过程中发送,这可能是你没有得到mouseEntered
和mouseExited
消息的原因之一。但是,如果您实现NSDraggingDestination
协议并将视图注册为被拖动的数据类型的可能接收者,则您将获得draggingEntered
和draggingExited
消息。
请参阅拖放编程主题的拖放目的地部分。