Pregunta

Estoy intentando implementar un selector de color en mi aplicación Cocoa. (Sí, sé sobre NSColorPanel. No me gusta mucho. El punto de rodar el mío es que creo que puedo hacerlo mejor).

Aquí hay una imagen del estado actual de mi selector.

 ¡Vista personalizada!
(fuente: ryanballantyne.name )

Los pozos que rodean la rueda de color son subclases NSColorWell. Se instancian mediante programación y se agregan a la vista de la rueda de colores (una subclase NSView) llamando a addSubView en la clase de rueda de colores.

Quiero hacerlo para que pueda arrastrar los pozos de color por sus asas. El comienzo de ese viaje está haciendo que el cursor cambie a una mano abierta cuando el mouse se desplaza sobre los mangos. Lamentablemente, no puedo usar un cursor directo para esto porque la mayoría de mis vistas están giradas . Por lo tanto, debo usar los eventos mouseMoved y hacer la detección de golpes yo mismo.

Aquí está el código de evento del mouse que intento hacer funcionar:

- (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;
}

Encuentro que mi método mouseMoved nunca se llama. Lo mismo para entrar y salir. Sin embargo, cuando implemento mouseDown, se llama a uno , por lo que al menos me llegan algunos eventos, pero no los que quiero.

¿Alguna idea? Gracias!

¿Fue útil?

Solución

mouseEntered: y mouseExited: no realiza un seguimiento de la entrada / salida de su vista directamente; realizan un seguimiento de la entrada / salida de cualquier área de seguimiento que haya establecido en su vista. Los métodos relevantes son -addTrackingRect: owner: userData: assumeInside: y -removeTrackingRect: . Simplemente pase [self límites] para el primer parámetro si desea realizar un seguimiento de toda su vista. Si su aplicación es solo 10.5+, probablemente debería usar NSTrackingArea en su lugar, ya que admite directamente obtener eventos movidos por el mouse solo dentro del área de seguimiento.

Tenga en cuenta que 1) los rectificadores de seguimiento tienen el mismo comportamiento un tanto extraño que los rectificadores de cursor con vistas rotadas, y 2) si sus límites cambian (no solo su marco) probablemente necesitará restablecer su seguimiento de rect, así que guarde la etiqueta del seguimiento de rect para eliminarlo más tarde.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top