2013-03-08 2 views
1

Я создал перетаскиваемый 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.

ответ

0

вы получаете уведомление NSWindowDidMove , но не вживую.

Если вам нужны живые обновления, это невозможно по умолчанию AFAIK. то же, что и во время изменение размера, кадр не обновляется.

см How to receive notifications when moving Window by mouse? для некоторых ссылок о том, как сделать это

0

Код отслеживания вашей мыши не требуется, если -setMovableByWindowBackground: получает вызов; вы в основном просто дублируете эту работу. По его словам, я бы сказал, что ваш метод -init не вызван, скорее всего, потому, что вы загружаетесь из .xib (который вместо этого вызывает -initWithCoder:).

Если окно исключительно создается путем XIb загрузки, заменить все выше код только это:

- (void)awakeFromNib 
{ 
    [self setMovableByWindowBackground:YES]; 
} 

А почему вы видите мерцание, моя догадка, что это потому, что ввод мыши не синхронизируется с обновлением экрана, поэтому программное создание окна после мыши немного сложнее, чем просто обновление при каждом перемещении мыши. Но если вы позволите NSWindow позаботиться об этом для вас, вам не нужно об этом беспокоиться.

+0

Кстати, '[само setMovable: YES]' также ненужным, если вы не установите его в NO в другом месте - по умолчанию YES. –

+0

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

+0

Правильно, это прозрачное окно без полей. Извините, что не упоминал об этом! Однако, похоже, он работает (перемещается) без кода mousedragged/mousedown. Но причина, по которой у меня был этот код, в первую очередь заключалась в том, чтобы что-то сделать с расположением перетаскивания, пока его таскают. И какао, кажется, не сообщает о происхождении кадра правильно во время перетаскивания (он немного отстает от сообщения о правильном числе). Я уточню свой вопрос через пять минут с дополнительной информацией. – Wesley

Смежные вопросы