Draggable NSView - PullRequest
       2

Draggable NSView

1 голос
/ 01 апреля 2012

Как я могу программно создать NSView, чтобы пользователь мог перемещать свою позицию с помощью мыши? Какие свойства мне нужно присвоить представлению? Спасибо!

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

1 Ответ

2 голосов
/ 01 апреля 2012

К сожалению, нет такого простого способа, как setMoveByWindowBackground: вы можете сделать это с окном.Вы должны переопределить mouseDown :, mouseDragged: и mouseUp: и использовать setFrameOrigin: в зависимости от положения указателя мыши.Чтобы при первом щелчке внутри него не было скачка вида, вам также необходимо учитывать смещение между исходным видом представления и тем, где находится указатель moue в представлении при первом щелчке.Вот пример, который я сделал в проекте для перемещения «плиток» в родительском виде (это было для компьютерной версии игры «Upwords», которая похожа на 3d скрэббл).

-(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.subviews)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...