Потеря власти при перетаскивании NSView - PullRequest
0 голосов
/ 21 марта 2012

У меня обработан базовый чертежный вид, в настоящее время я работаю с рамкой размера, которая является видом, накладываемым поверх пользовательских видов, заполняющих чертежный вид.Одной из его функций является возможность изменения положения дочернего вида, однако я заметил, что, хотя я устанавливаю правильные значения, чтобы установить рамку размера, а его дочерний вид - в новое положение мыши, если я переместлюбыстро щелкает мышью, и в итоге вид остается позади на полпути.

Я предполагаю, что есть некоторая информация об ускорении, которую я не отслеживаю, но я не могу понять, какие дополнительные шаги мне нужно предпринятьчтобы убедиться, что представления идут в ногу с мышью.

Вот код, который я использую в своем событии mouseDragged:

-(void)mouseDragged:(NSEvent *)theEvent{
    if(mouseDown){
        if(isSizing){
            NSPoint movement = [[self window] convertBaseToScreen:[theEvent locationInWindow]];
            NSRect newRect;
            switch (sizingDirection) {
                case SIZING_DIR_UP:
                    //Moving up should increase height, moving down should decrease height
                    newRect = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, self.frame.size.height - (_yPos - movement.y));
                    break;
                case SIZING_DIR_DOWN:
                    //Moving down should decrease height, moving down should increase height
                    newRect = CGRectMake(self.frame.origin.x, self.frame.origin.y + (movement.y - _yPos), self.frame.size.width, self.frame.size.height - (movement.y - _yPos));
                    break;
                case SIZING_DIR_LEFT:
                    //Moving left should increase width, moving right should decrease width
                    newRect = CGRectMake(self.frame.origin.x + (movement.x - _xPos), self.frame.origin.y, self.frame.size.width - (movement.x - _xPos), self.frame.size.height);
                    break;
                case SIZING_DIR_RIGHT:
                    //Moving right should decrease width, moving right should increase width
                    newRect = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width - (_xPos - movement.x), self.frame.size.height);
                    break;
                default:
                    newRect = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width - (_xPos - movement.x), self.frame.size.height - (_yPos - movement.y));
                    break;
            }
            NSRect newElementRect = CGRectMake(newRect.origin.x + 6, newRect.origin.y + 6, newRect.size.width - 12, newRect.size.height - 12);
            _xPos = movement.x;
            _yPos = movement.y;
            [self setFrame:newRect];
            [self setNeedsDisplay:YES];
            [_child setFrame:newElementRect];
            [_child setNeedsDisplay:YES];
        }else {
            NSPoint movement = [[self window] convertBaseToScreen:[theEvent locationInWindow]];
            NSRect newRect = CGRectMake(self.frame.origin.x + (movement.x - _xPos), self.frame.origin.y + (movement.y - _yPos), self.frame.size.width, self.frame.size.height);
            NSRect newElementRect = CGRectMake(newRect.origin.x + 6, newRect.origin.y + 6, newRect.size.width - 12, newRect.size.height - 12);
            _xPos = movement.x;
            _yPos = movement.y;
            [self setFrame:newRect];
            [self setNeedsDisplay:YES];
            [_child setFrame:newElementRect];
            [_child setNeedsDisplay:YES];
        }
    }
}

Переменные mouseDown и isSizing, а также _xPos и ​​_yPos изначальноустановите для события mouseDown, чтобы я мог сравнивать событие mouseDragged и обновлять положение представлений.

Кто-нибудь может понять, в чем может быть проблема?

1 Ответ

0 голосов
/ 21 марта 2012

Я сталкиваюсь с той же проблемой, когда пытаюсь перетащить вид, который был настроен на затухание, как только мышь покинула вид.Я решил проблему, установив ivar BOOL isDragged, который установлен на YES при запуске перетаскивания, и NO в событии mouseUp, поэтому перед тем, как скрыть вид, мне пришлось проверить, что isDragged было установлено на NO.

Возможно, это не ваш случай, но я надеюсь, что это может как-то вам помочь!

...