У меня обработан базовый чертежный вид, в настоящее время я работаю с рамкой размера, которая является видом, накладываемым поверх пользовательских видов, заполняющих чертежный вид.Одной из его функций является возможность изменения положения дочернего вида, однако я заметил, что, хотя я устанавливаю правильные значения, чтобы установить рамку размера, а его дочерний вид - в новое положение мыши, если я переместлюбыстро щелкает мышью, и в итоге вид остается позади на полпути.
Я предполагаю, что есть некоторая информация об ускорении, которую я не отслеживаю, но я не могу понять, какие дополнительные шаги мне нужно предпринятьчтобы убедиться, что представления идут в ногу с мышью.
Вот код, который я использую в своем событии 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 и обновлять положение представлений.
Кто-нибудь может понять, в чем может быть проблема?