Подкласс NSColorWell не получает события mouseMoved
-
10-07-2019 - |
Вопрос
Я пытаюсь реализовать палитру цветов в своем приложении 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) если ваши границы изменяются (не только ваш фрейм), вам, вероятно, потребуется восстановить прямоугольник отслеживания, поэтому сохраните тег прямоугольника отслеживания, чтобы удалить его позже.