Pergunta

Estou usando o inputmethodkit e tentando colocar uma janela abaixo de algum texto.

_currentClient é um IMKTextInput instância

candidatos é um IMKCandidates instância

// Get the current location to place the window
NSRect tempRect = NSMakeRect(0, 0, 0, 0);
NSDictionary* clientData = [_currentClient attributesForCharacterIndex:0 lineHeightRectangle:&tempRect];
NSPoint* windowInsertionPoint = (NSPoint*)[clientData objectForKey:@"IMKBaseline"];
...
[candidates setCandidateFrameTopLeft:*windowInsertionPoint];
[candidates showCandidates];

Agora, eu sei que o windowInsertionPoint variável está bem, quando depuro posso ver seu valor, por exemplo:PPonto:{647.365}

No entanto, quando eu uso isso, a janela do candidato aparece apenas no canto inferior esquerdo da tela.Eu nunca trabalhei com posicionamento de tela antes, então agradecemos ajuda.

Se eu passar valores estáticos arbitrários para setCandidateFrameTopLeft, ele é colocado na tela.Os seguintes trabalhos:

[candidates setCandidateFrameTopLeft:NSMakePoint(401, 354)];

É um problema de ponteiro?

Foi útil?

Solução

OK, a solução para isso é que sou um idiota.Aqui está o código que você precisa:

NSRect tempRect;
NSDictionary* clientData = [_currentClient attributesForCharacterIndex:0 lineHeightRectangle:&tempRect];
NSPoint windowInsertionPoint = NSMakePoint(NSMinX(tempRect), NSMinY(tempRect));

A documentação para Atributos IMKTextInputForCharacterIndex diz

linhaRect:No retorno, um retângulo que enquadra um retângulo de um pixel de largura com a altura da linha.Este retângulo é orientado da mesma forma que a linha.

Isso significa que ele retorna um NSRect para a variável que você passou para o lineHeightRectangle valor.O ponto importante é que a localização desse NSRect seja a localização do personagem que você está procurando.Então, você precisa apenas marcar um ponto nesse retângulo e usar NSMinY para o valor de Y.O retângulo tem apenas um pixel de largura, então Min/Max para X são basicamente iguais.

Outras dicas

Você provavelmente não tem mais esse problema, mas isso também funciona no futuro:

            [candidates show:kIMKLocateCandidatesBelowHint];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top