Вопрос

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

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

 Пользовательская видимость!
(источник: 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, этот действительно вызывается, поэтому мне приходят по крайней мере некоторые события, но не те, которые я хочу.

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

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top