メイン ウィンドウの 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)];
}
}
...