Я создал перетаскиваемый NSWindow, который можно перетаскивать через его содержимое. У него нет заголовка (без полей).Draggable NSWindow мерцание
Перетаскивание работает отлично, но так часто бывает мерцание. Кажется, окно быстро переходит в неправильное положение, а затем возвращается туда, где находится мышь (все еще удерживая мышь). Кажется, что он работает лучше на моем macbook, чем на моем IMAC.
Может ли кто-нибудь выяснить, что я делаю неправильно?
В INIT я назвал эти два метода:
[self setMovableByWindowBackground:YES];
[self setMovable:YES];
Эти переменные используются:
NSPoint currentLocation;
NSPoint newOrigin;
int offsetX,offsetY;
А вот код относительно перетаскивания:
- (void)mouseMoved:(NSEvent *)theEvent{
}
- (void)mouseDown:(NSEvent *)theEvent{
currentLocation = [self convertBaseToScreen:[self mouseLocationOutsideOfEventStream]];
offsetX = currentLocation.x - [self frame].origin.x;
offsetY = currentLocation.y - [self frame].origin.y;
}
- (void)mouseDragged:(NSEvent *)theEvent{
currentLocation = [self convertBaseToScreen:[self mouseLocationOutsideOfEventStream]];
newOrigin.x = currentLocation.x - offsetX;
newOrigin.y = currentLocation.y - offsetY;
[self setFrameOrigin:newOrigin];
}
EDIT: ОК, так как упоминалось, что это прозрачный без полей NSPanel. И да, мне, похоже, не нужен код выше.
НО, мне нужно место, куда перетаскивается окно, и оно мне нужно постоянно.
Если я просто получить кадр происхождения, как так:
self.frame.origin
Это сообщает неправильный номер. Похоже, что потребуется некоторое время, прежде чем какао обновит это внутреннее значение.
Во-вторых, панель не активируется. Он отлично работает при перемещении в первый раз, когда он загружается (сфокусирован) и вызывается mouseDragged. Но не тогда, когда я взаимодействую с другим приложением, а затем возвращаюсь. Вызывается только mouseDown и mouseUp.
Кстати, '[само setMovable: YES]' также ненужным, если вы не установите его в NO в другом месте - по умолчанию YES. –
AFAIK, необходимо (re) -обеспечить отслеживание/перемещение кода мыши для окон, которые используют 'NSBorderlessWindowMask'. Похоже, что этот код основан на примере кода Apple RoundTransparentWindow: https://developer.apple.com/library/mac/#samplecode/RoundTransparentWindow/Listings/Classes_CustomWindow_m.html#//apple_ref/doc/uid/DTS10000401- Classes_CustomWindow_m-DontLinkElementID_8. Я также считаю, что 'initWithCoder:' вещь имеет значение только для всего, кроме 'NSWindow', поскольку она не поддерживает''. –
NSGod
Правильно, это прозрачное окно без полей. Извините, что не упоминал об этом! Однако, похоже, он работает (перемещается) без кода mousedragged/mousedown. Но причина, по которой у меня был этот код, в первую очередь заключалась в том, чтобы что-то сделать с расположением перетаскивания, пока его таскают. И какао, кажется, не сообщает о происхождении кадра правильно во время перетаскивания (он немного отстает от сообщения о правильном числе). Я уточню свой вопрос через пять минут с дополнительной информацией. – Wesley