4

別の 内に クラスMyView( のサブクラス) のビューがいくつかあります。、、、、および を実装します。NSViewNSViewMyView-mouseEntered:-mouseExited:-mouseDown:-mouseDragged:-mouseUp:

ほとんどの場合、MyViewがマウス ダウン イベントを受信するとMyView、次のマウス アップ イベントまで、後続のすべてのマウス ドラッグ イベントが で受信されます。カーソルが の外に出てもMyView. これが予期される動作です。

がマウスMyViewダウン イベントを受け取る場合がありますが、カーソルが 内にある間は、マウス ドラッグおよびマウス アップ イベントのみを受け取りますMyView。カーソルが別の に移動するとMyViewMyViewマウス ドラッグ イベントの受信が開始され (最初にマウス ダウン イベントを受信せずに)、その後のマウス アップ イベントを受信できます。

重要な場合、マウスダウン イベントは の上にFooView(のサブクラスNSView) を作成しMyView、マウス ドラッグ イベントは のフレームのサイズを変更しFooViewます。これらの のいずれかが作成された後にのみ問題を再現できたので、これは関連している可能性がありますFooViewFooViewマウス イベント メソッドを実装しません。

私はこれをしばらくいじっていましたが、意図的に問題を再現することも、単純な例で問題を再現することもできませんでした。私のコードに関する質問に喜んでお答えします。投稿する関連部分が何であるかわかりません。

4

2 に答える 2

2

根本的な問題が何であるかはわかりません(このCocoaの動作は私には一貫していないようです)...しかし、考えられる回避策の1つは次のとおりです。

  1. スーパービューでMyView、発生したインスタンスを追跡するインスタンス変数を作成します-mouseDown:
  2. を受け取ったら、を操作する代わりに-mouseDragged:、スーパービューに保存されているインスタンス参照を操作します。MyViewselfMyView

...これにより、独自のイベントループを実行しなくても、ドラッグされているオブジェクトを一貫して追跡できるようになります。

于 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 に答える