我知道标题选得不好,但我不知道如何更好地描述它......
我有一个 NSView 实例,我将其添加到右侧屏幕边缘的窗口中:
CGRect zoneFrame = CGRectMake(screenFrame.size.width - 50, 0, 50, screenFrame.size.height);
当用户到达屏幕边缘时,我想捕获鼠标。然后,我使用此方法将位置发送到自定义委托协议:
- (void)mouseMoved:(NSEvent *)mouseEvent {
[_delegate mouseMovedTo:[mouseEvent locationInWindow]];
}
我现在想继续捕获真实的鼠标移动,当用户继续将其拖动到右侧时。但是,正如预期的那样,当指针超出边界视图时,NSView 不会收到移动操作,或者屏幕边缘。
我想创建一些你可以想到的假想视图的东西,它放在屏幕旁边。
是否有可能继续捕获鼠标?然后让鼠标在一直移动到"虚构"视图的左边缘后才移动到视图之外?
鼠标按下时跟踪鼠标,则必须手动跟踪事件。这是一个模板代码来执行此操作。
- (void)trackMouseWithEvent:(NSEvent *)theEvent {
NSPoint curPoint = [self convertPoint: [theEvent locationInWindow] fromView: nil];
while (1) {
NSEvent *theEvent = [[self window] nextEventMatchingMask: (NSLeftMouseDraggedMask | NSLeftMouseUpMask)];
NSPoint newPoint = [self convertPoint: [theEvent locationInWindow] fromView: nil];
// Drag distance is curPoint - newPoint
if ([theEvent type] == NSLeftMouseUp)
break;
}
}
如果希望框架在甚至未拖动时发送鼠标移动事件,则必须显式设置视图以接收鼠标移动事件。由于调度每次鼠标移动都是一个昂贵的操作,如果您没有明确要求接收鼠标移动事件,您将只会获得鼠标输入和鼠标退出事件。