Несколько пользовательских элементов управления, которые используют mouseMoved в одном окне - PullRequest
0 голосов
/ 02 февраля 2009

Сначала у меня было одно окно с моим пользовательским управлением. Чтобы заставить его принимать события перемещения мыши, я просто вставил в него awakeFromNib:

Код:

[[self window] makeFirstResponder: self]; [[само окно] setAcceptsMouseMovedEvents: YES];

Теперь я делаю что-то с четырьмя из них в одном окне, и это больше не работает. Во-первых, я вынул их из элемента управления awakeFromNib и решил, что для управления им буду использовать мой appController, т.е. [window makeFirstResponder: View]

Мой вопрос: как мне управлять четырьмя из них в одном и том же виде, если я хочу, чтобы каждый отвечал на события, перемещенные мышью? Прямо сейчас я сказал окну отвечать на события mouseMoved, но ни одно из представлений не отвечает на mouseMoved.

1 Ответ

1 голос
/ 03 февраля 2009

Вам также потребуется переопределить -acceptsFirstResponder, чтобы вернуть YES.

    #pragma mark NSResponder Overrides
    - (BOOL)acceptsFirstResponder
    {
    return YES;
    }

События -mouseMoved дороги, поэтому я отключаю события перемещения мыши, когда вызывается сообщение -mouseExited моего элемента управления, и включаю его в -mouseEntered.

    - (void)mouseEntered:(NSEvent *)theEvent
{
    [[self window] setAcceptsMouseMovedEvents:YES];
    [[self window] makeFirstResponder:self];
}

- (void)mouseMoved:(NSEvent *)theEvent
{
...
}

- (void)mouseExited:(NSEvent *)theEvent
{
    [[self window] setAcceptsMouseMovedEvents:NO];
}

Я быстро проверил это в своем приложении для управления. Я несколько раз продублировал элемент управления в файле nib, и он работал как положено.

Вам также может понадобиться:

- (void)awakeFromNib
{
    [[self window] setAcceptsMouseMovedEvents:YES];
    [self addTrackingRect:[self bounds] owner:self userData:NULL assumeInside:YES];
}

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

...