Я проверил ваш код, и, похоже, ошибка заключалась в том, что иногда NSPoint newMouseLocation = [window convertBaseToScreen:[newEvent locationInWindow]];
возвращал исходное местоположение мыши вместо нового.
Я не уверен, почему это не получится, но, несмотря на этоне оптимальный способ сделать это.Вместо того, чтобы вычислять новый кадр из исходного местоположения мыши, вы должны постоянно обновлять это местоположение и просто перемещать окно на величину, на которую мышь переместилась в текущей итерации отслеживания
Вотисправлена укороченная версия, которая, похоже, устраняет ошибку.
- (void) mouseDown:(NSEvent *)event
{
NSWindow *window = self;
NSPoint originalMouseLocation = [window convertBaseToScreen:[event locationInWindow]];
while (YES)
{
NSEvent *newEvent = [window
nextEventMatchingMask:(NSLeftMouseDraggedMask | NSLeftMouseUpMask)];
if ([newEvent type] == NSLeftMouseUp)
{
break;
}
NSPoint newMouseLocation = [window convertBaseToScreen:[newEvent locationInWindow]];
NSPoint delta = NSMakePoint(
roundf(newMouseLocation.x - originalMouseLocation.x),
roundf(newMouseLocation.y - originalMouseLocation.y));
NSRect newFrame = [window frame];
newFrame.size.width += delta.x*2; // customize
newFrame.size.height -= delta.y;
newFrame.origin.y += delta.y;
[window setFrame:newFrame display:YES animate:NO];
originalMouseLocation = newMouseLocation; // <-- added this
}
}