Pergunta

Eu estou tentando implementar um seletor de cores em meu aplicativo de cacau. (Sim, eu sei sobre NSColorPanel. Eu não gosto muito. O ponto de rolar minha própria é que eu acho que posso fazer melhor.)

Aqui está uma imagem do estado actual da minha selecionador.

viewness feita sob encomenda!
(fonte: ryanballantyne.name )

Os poços em torno da roda de cores são subclasses NSColorWell. Eles são instanciado programaticamente e adicionada à vista roda de cores (uma subclasse NSView) chamando addSubview na classe roda de cores.

Eu quero fazê-lo de modo que você pode arrastar os poços de cor em torno de suas pegas. O início dessa jornada é fazer a mudança cursor para uma mão aberta quando os paira mouse sobre as alças. Infelizmente, eu não posso usar um cursor rect para isso, porque a maioria dos meus pontos de vista são rodados . Devo, portanto, usar eventos mouseMoved e fazer a detecção de ocorrências mim mesmo.

Aqui está o código de evento do mouse eu estou tentando fazer o trabalho:

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

Eu acho que o meu método mouseMoved nunca é chamado. O mesmo vale para entrou e saiu. No entanto, quando eu implementar mouseDown, que um faz obter chamado, assim pelo menos alguns eventos estão ficando para mim, não apenas os que eu quero.

Todas as idéias? Obrigado!

Foi útil?

Solução

mouseEntered: e mouseExited: não acompanhar entrar / sair a sua visão diretamente; Eles acompanham entrar / sair todas as áreas de rastreamento que você estabeleceu na sua opinião. Os métodos relevantes são -addTrackingRect:owner:userData:assumeInside: e -removeTrackingRect:. Basta passar [self bounds] para o primeiro parâmetro se você quiser toda a sua vista a ser rastreado. Se seu aplicativo só está 10.5+, você provavelmente deve usar NSTrackingArea vez como ele suporta diretamente recebendo eventos moveu-do mouse apenas dentro da área de monitoramento.

Tenha em mente que 1) rastreamento rects ter o mesmo comportamento um pouco estranho como rects cursor w / r / t girado vistas, e 2) se a sua mudança de limites (não apenas o seu quadro) você provavelmente vai precisar de re-estabelecer o acompanhamento rect, para salvar tag do rect rastreamento para removê-lo mais tarde.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top