Подкласс NSColorWell не получает события mouseMoved - PullRequest
1 голос
/ 02 августа 2009

Я пытаюсь реализовать палитру цветов в моем приложении Какао. (Да, я знаю о NSColorPanel. Мне это не очень нравится. Смысл того, чтобы кататься самостоятельно, заключается в том, что я думаю, что могу добиться большего.)

Вот изображение текущего состояния моего сборщика.

Custom viewness!
(источник: ryanballantyne.name )

Лунки, окружающие цветовое колесо, являются подклассами NSColorWell. Они создаются программно и добавляются в представление цветового круга (подкласс NSView), вызывая addSubView для класса цветового колеса.

Я хочу сделать так, чтобы вы могли перетаскивать цветные ямы вокруг их ручками. В начале этого путешествия курсор меняется на открытую руку, когда мышь наводится на рукоятки. К сожалению, Я не могу использовать прямоугольник курсора для этого, потому что большинство моих представлений повернуто . Поэтому я должен использовать события mouseMoved и сам определять попадания.

Вот код события мыши, который я пытаюсь заставить работать:

- (void)mouseMoved:(NSEvent*)event
{
    NSLog(@"I am over here!\n");

    [super mouseMoved:event];

    NSPoint eventPoint = [self convertPoint:[event locationInWindow] fromView:nil];
    BOOL isInHandle = [grabHandle containsPoint:eventPoint];
    if (isInHandle && [NSCursor currentCursor] != [NSCursor openHandCursor])  {
        [[NSCursor openHandCursor] push];
    }
    else if (!isInHandle)  [NSCursor pop];
}

- (void)mouseEntered:(NSEvent*)event
{
    [[self window] setAcceptsMouseMovedEvents:YES];
}
- (void)mouseExited:(NSEvent*)event
{
    [[self window] setAcceptsMouseMovedEvents:NO];
    [NSCursor pop];
}

- (BOOL)acceptsFirstResponder
{
    return YES;
}
- (BOOL)resignFirstResponder
{
    return YES;
}

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

Есть идеи? Спасибо!

1 Ответ

2 голосов
/ 02 августа 2009

mouseEntered: и mouseExited: не отслеживать вход / выход из вашего представления напрямую; они отслеживают вход / выход из любых областей отслеживания, которые вы установили по вашему мнению. Соответствующие методы -addTrackingRect:owner:userData:assumeInside: и -removeTrackingRect:. Просто передайте [self bounds] для первого параметра, если вы хотите, чтобы весь ваш вид отслеживался. Если ваше приложение только 10.5+, вам, вероятно, следует использовать вместо него NSTrackingArea, поскольку оно напрямую поддерживает получение событий перемещения мыши только внутри области отслеживания.

Имейте в виду, что 1) трекинг-треки имеют то же странное поведение, что и ректоры курсора с повернутыми представлениями, и 2) если ваши границы изменяются (не только ваш кадр), вам, вероятно, придется восстановить прямоугольник отслеживания, поэтому сохраните тег прямоугольника отслеживания, чтобы удалить его позже.

...