2012-04-01 16 views
1

ユーザがマウスで位置を移動できるようにNSViewをプログラムで作成する方法はありますか?ビューに割り当てるプロパティは何ですか?ありがとう!Draggable NSView

newView = [helpWindow contentView]; 
    [contentView addSubview:newView]; 
    //add properties of newView to be able to respond to touch and can be draggable 

答えて

2

残念ながら、setMoveByWindowBackgroundのような簡単な方法はありません:あなたはウィンドウで行うことができます。 mouseDown :, mouseDragged :, mouseUp:をオーバーライドし、マウスポインタの位置に基づいてsetFrameOrigin:を使用する必要があります。ビューを最初にクリックしたときにビューがジャンプしないようにするには、ビューの起点とマウスポインタが最初にクリックされたときの位置との間のオフセットも考慮する必要があります。ここでは、親ビューで「タイル」を動かすためのプロジェクトで作成した例を示します(これは、3Dスクラブルのようなゲーム "Upwords"のコンピュータ版用です)。

-(void)mouseDown:(NSEvent *) theEvent{ 
    self.mouseLoc = [theEvent locationInWindow]; 
    self.movingTile = [self hitTest:self.mouseLoc]; //returns the object clicked on 
    int tagID = self.movingTile.tag; 
    if (tagID > 0 && tagID < 8) { 
     [self.viewsList exchangeObjectAtIndex:[self.viewsList indexOfObject:self.movingTile] withObjectAtIndex: 20]; // 20 is the highest index in the array in this case 
     [self setSubviews:self.viewsList]; //Reorder's the subviews so the picked up tile always appears on top 
     self.hit = 1; 
     NSPoint cLoc = [self.movingTile convertPoint:self.mouseLoc fromView:nil]; 
     NSPoint loc = NSMakePoint(self.mouseLoc.x - cLoc.x, self.mouseLoc.y - cLoc.y); 
     [self.movingTile setFrameOrigin:loc]; 
     self.kX = cLoc.x; //this is the x offset between where the mouse was clicked and "movingTile's" x origin 
     self.kY = cLoc.y; //this is the y offset between where the mouse was clicked and "movingTile's" y origin 
    } 
} 

-(void)mouseDragged:(NSEvent *)theEvent { 
    if (self.hit == 1) { 
     self.mouseLoc = [theEvent locationInWindow]; 
     NSPoint newLoc = NSMakePoint(self.mouseLoc.x - self.kX, self.mouseLoc.y - self.kY); 
     [self.movingTile setFrameOrigin:newLoc]; 
    } 
} 

この例では、さらに複雑な問題を指摘しています。ビューを移動すると、他のビューの下に移動しているように見えるので、親ビューのサブビューの最上位ビュー(viewsListはself.subviewから取得した配列)を移動ビューにします。