我有一个基本的绘图视图,目前我正在处理一个大小的框架,这是一个覆盖在填充图纸视图的自定义视图之上的视图。它的一个特点是允许重新定位其'子视图,但是我注意到虽然我设置了正确的值来设置大小框架及其'子视图到新的鼠标位置,但如果我移动鼠标快速移动,视线最终会在中途落后。
我假设有一些我没有跟踪的加速度信息,但我似乎无法找出我需要采取哪些额外步骤来确保视图跟上鼠标。
这是我在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事件进行比较并更新视图的位置。
任何人都可以看到问题所在吗?
答案 0 :(得分:0)
当鼠标离开视图时,尝试拖动设置为淡出的视图时遇到同样的问题。我通过设置在开始拖动时设置为BOOL isDragged
的ivar YES
和mouseUp事件中的NO
来解决了这个问题,因此在隐藏视图之前我必须检查{{1} }已设置为isDragged
。
也许这不是你的情况,但我希望这能以某种方式帮助你!