Não obtendo eventos mouseMoved NSColorWell subclasse
-
10-07-2019 - |
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.
(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!
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.