Posicionamento da janela NSPoint e IMKCandidate
-
11-12-2019 - |
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?
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];