4

我在另一个内部有几个类MyView(的子类)的视图。实现, , , , 和.NSViewNSViewMyView-mouseEntered:-mouseExited:-mouseDown:-mouseDragged:-mouseUp:

几乎总是,当 aMyView接收到鼠标按下事件时,所有后续的鼠标拖动事件都会被相同的接收到,MyView直到下一个鼠标按下事件。即使光标超出MyView. 这是预期的行为。

偶尔, aMyView会接收到鼠标按下事件,但只会在光标停留在MyView. 如果光标移动到不同的MyView,那么它MyView开始接收鼠标拖动事件(没有首先接收鼠标按下事件)并且可以接收随后的鼠标向上事件。

FooView万一它很重要,鼠标按下事件会NSView在. 这可能是相关的,因为我只能在创建其中一个之后才能重现该问题。不实现任何鼠标事件方法。MyViewFooViewFooViewFooView

我已经搞砸了一段时间,并且无法故意重现该问题或在一个简单的示例中重现该问题。我很乐意回答有关我的代码的任何问题,我只是不确定要发布的相关部分是什么。

4

2 回答 2

2

不确定根本问题是什么(这种 Cocoa 行为对我来说似乎不一致)......但这是一种可能的解决方法:

  1. 在 superview 中,创建一个实例变量来跟踪发生的MyView实例-mouseDown:
  2. 当您收到-mouseDragged:in 时MyView,不是对 进行操作,而是对存储在超级视图中selfMyView实例引用进行操作。

...然后您将能够持续跟踪正在拖动的对象,而无需运行您自己的事件循环。

于 2011-09-19T04:00:42.113 回答
0

您需要在视图中运行自己的鼠标跟踪循环,直到鼠标启动。您可以通过将它们传递给 nextEventMatchingMask: 来扩展它以处理更多类型的事件。

- (void)mouseDown:(NSEvent*)event
{
    CGPoint hitPoint = [self pointInViewSpaceFromEvent:event];

    BOOL isDragging = NO;
    BOOL isTracking = YES;

    while (isTracking)
    {       
        switch ([event type])
        {
            case NSLeftMouseDown:
                [self singleMouseDownAtPoint:hitPoint withModifierFlags:[event modifierFlags]];
                break;

            case NSLeftMouseUp:
                isTracking = NO;
                if (isDragging)
                    [self mouseDraggingDidEndAtPoint:hitPoint];
                else
                    [self singleMouseUpAtPoint:hitPoint withEvent:event];
                break;

            case NSLeftMouseDragged:
                if (isDragging)
                    [self mouseDraggingAtPoint:hitPoint withModifierFlags:[event modifierFlags]];
                else
                    isDragging = YES;
                break;
            default:
                break;
        }

        if (isTracking)
        {
            event = [[self window] nextEventMatchingMask:NSLeftMouseDraggedMask | NSLeftMouseUpMask];
            hitPoint = [self pointInViewSpaceFromEvent:event];
        }
    }
}
于 2011-09-17T08:54:50.077 回答