拖动NSView时丢失抓地力

时间:2012-03-21 09:46:26

标签: cocoa events drag nsview

我有一个基本的绘图视图,目前我正在处理一个大小的框架,这是一个覆盖在填充图纸视图的自定义视图之上的视图。它的一个特点是允许重新定位其'子视图,但是我注意到虽然我设置了正确的值来设置大小框架及其'子视图到新的鼠标位置,但如果我移动鼠标快速移动,视线最终会在中途落后。

我假设有一些我没有跟踪的加速度信息,但我似乎无法找出我需要采取哪些额外步骤来确保视图跟上鼠标。

这是我在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 :(得分:0)

当鼠标离开视图时,尝试拖动设置为淡出的视图时遇到同样的问题。我通过设置在开始拖动时设置为BOOL isDragged的ivar YES和mouseUp事件中的NO来解决了这个问题,因此在隐藏视图之前我必须检查{{1} }已设置为isDragged

也许这不是你的情况,但我希望这能以某种方式帮助你!