メインウィンドウの2つのサブビューを作成するアプリケーションがあり、サブビューはページと呼ばれるクラスのサブビューであり、サブビューごとにAdと呼ばれるクラスの別のサブビューを配置します。私は、ページのサブビューの間に広告クラスをドラッグしています。最初はAdクラスのビューのフレームをリセットしていましたが、実際にしたいのは、NSLeftMouseUpイベントが発生する場所に配置することだけです。NSWindowでmouseUpのNSPointを取得する
これを行うための私のプロセスは、作成中のすべてのPageサブビューを配列に登録することです。次に、NSWindowのサブクラスを作成し、そのクラスをIBのメインウィンドウに割り当てました。ページビューの配列をこのクラスに渡します。
私はsendEventメソッドを上書きし、イベントがNSLeftMouseDown、NSLeftMouseDraggedまたはNSLeftMouseUpかどうかを確認すると思います。 NSLeftMouseDownは、クリックされたサブビューがウィンドウ階層の最も深いサブビューであるかどうかをチェックして確認することです - ウィンドウ - >ページクラス - >広告クラス。配列をループして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)];
}
}
...