2

メイン ウィンドウの 2 つのサブビューを作成するアプリがあります。サブビューは Page というクラスのもので、各サブビューには Ad というクラスの別のサブビューを配置しています。ページのサブビュー間で Ad クラスをドラッグしています。最初は、Ad クラスのビューのフレームをリセットしただけでしたが、本当にやりたいのは、NSLeftMouseUp イベントが発生する場所に配置することです。

これを行うための私のプロセスは、すべての Page サブビューを作成時に配列に登録することです。次に、NSWindow のサブクラスを作成し、そのクラスを IB のメイン ウィンドウに割り当てました。ページ ビューの配列をこのクラスに渡します。

イベントがNSLeftMouseDown、NSLeftMouseDragged、またはNSLeftMouseUpであるかどうかを確認して、sendEventメソッドを上書きすると思います。NSLeftMouseDown は、クリックされたサブビューがウィンドウ階層の最も深いサブビュー (window->Page クラス->Ad クラス) であるかどうかを確認します。これは、ページではなく広告を移動したいためです。配列をループし、クリックされた NSView (Ad) の descendentOf メソッドをチェックして、列挙されている NSView (Page) の子孫であるかどうかを確認します。(それが理にかなっていることを願っています)。次に、フレームも引っ張ります。

NSLeftMouseDragged では、カーソルを変更してドラッグ中の広告に似せます。

NSLeftMouseUp で、広告の移動先のビューを確認します。私が理解できないのは、そのビューで NSLeftMouseUp の NSPoint を取得する方法です。ウィンドウでは取得できますが、そのポイントの x/y は受信側のサブビューではかなりずれます...どうすれば取得できますか?サブビュー内の NSPoint?

...
} else if ([e type] == NSLeftMouseUp) {

    //get which view we are going to drop the ad on
    landingView = [[self contentView] hitTest:[e locationInWindow]];

    /****ui question here for Mike:
     if the mouseup event is not on a page class, should the mouse remain the dragcursor image here or should 
     we change it back to the mouse icon and stop this process****/

    if ([[landingView className] isEqual:@"Page"]) { 

        //get ad rect
        float adX = thisAdFrame.origin.x + 10.0;
        float adY = thisAdFrame.origin.y + 20.0;

        //get nspoint of mouse up event
        NSPoint p = [e locationInWindow];

        [landingView addSubview:theSubView];
        [theSubView setFrame:NSMakeRect(p.x, p.y, thisAdFrame.size.width, thisAdFrame.size.height)];

    }

}
 ...
4

1 に答える 1