Есть ли способ обойти эту причуду NSTrackingArea? - PullRequest
5 голосов
/ 25 февраля 2011

У меня здесь проблема. Я создаю NSTrackingArea, как это:

NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self frame] options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways owner:self userInfo:nil];
[self addTrackingArea:area];
[area release];

Это работает довольно хорошо. Тем не менее, вот проблема. Я настроил это так:

-(void)mouseEntered:(NSEvent *)event {
    [self toggleDetail];
}
-(void)mouseExited:(NSEvent *)event {
    [self toggleDetail];
}

И toggleDetail в основном так:

- (void)toggleDetail {
if (!attachedWindow) {
    NSPoint buttonPoint = NSMakePoint(NSMidX([conditionImage frame]),
                                      NSMidY([conditionImage frame]));
    attachedWindow = [[MAAttachedWindow alloc] initWithView:view 
                                            attachedToPoint:buttonPoint 
                                                   inWindow:[self window] 
                                                     onSide:12
                                                 atDistance:10.0];
    //config removed because of irrelevance
    [[self window] addChildWindow:attachedWindow ordered:NSWindowAbove];
} else {
    [[self window] removeChildWindow:attachedWindow];
    [attachedWindow orderOut:self];
    [attachedWindow release];
    attachedWindow = nil;
}

}

Теперь вот моя проблема. Когда мой MAAttachedWindow закрыт и я наведу курсор мыши на окно, оно открывается. Денди. Тем не менее, это хорошо, только когда я держу мышь подальше от MAAttachedWindow. Как только я наведу на него мышку (пока она еще над главным окном), она начинает резко открывать и закрывать MAAttachedWindow.

И вот почему: как только окно открывается, область отслеживания считает, что моя мышь больше не находится над окном, потому что перед ним всплывающее окно. Однако, как только он удаляет всплывающее окно, он думает, что моя мышь снова над ним, создавая и показывая всплывающее окно еще раз. Таким образом, это бесконечный цикл.

У меня вопрос, есть ли способ обойти это, когда он не может закрыть окно, если моя мышь не находится за пределами и окна и всплывающего окна или чего-то подобного. Есть ли способ сделать это?

1 Ответ

3 голосов
/ 06 марта 2011

См. - [NSWindow setIgnoresMouseEvents:].

Кстати, будьте очень осторожны с оверлейными окнами.Сложность с ними заключается в том, что вы должны дать ему абсолютные координаты, когда вы создаете его, и есть небольшая гонка - родительское окно можно перемещать между временем получения его кадра и временем создания дочернего окна.Перемещение окна выполняется Window Server и может выполняться независимо от приложения (поэтому вы можете перемещать окно, когда приложение работает на пляже).Сейчас это очень редко, что может быть проблемой, но это можно и довольно сложно исправить должным образом.Это большая проблема, если вы пытаетесь изменить размеры или переместить дочернее окно при изменении размера родительского окна.

Теперь я понимаю, что ничего из этого не может относиться к вам, но если это так, и вы можете подуматьальтернативы использованию дочерних окон, я бы посоветовал вам пойти на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...