2011-11-08 7 views
2

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

    } 

} 
... 

答えて

2

あなたは別の座標系に長方形、ポイント、などを変換するために、これらのヘルプなどのNSViews -convertPoint:fromView:-convertPointFromBacking:方法を見てみたいことがあります。

nilを指定すると、そのビューのウィンドウから変換されます。このコードはあなたに適用されます:

NSPoint eventLocation = [theSubView convertPoint:p fromView:nil]; 
関連する問題