Posizionamento della finestra Nspoint e IMKCandidate
-
11-12-2019 - |
Domanda
Sto usando il inputmethodkit e sto cercando di posizionare una finestra sotto del testo.
_currentclient è un'istanza IMKTextInput
I candidati sono un'istanza IMKCandidates
// 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];
.
Ora, so che la variabile windowInsertionPoint
va bene, quando Debug debug posso vedere il suo valore, ad esempio: nspoint: {647,365}
Comunque quando lo uso, la finestra del candidato mostra solo nell'angolo in basso a sinistra dello schermo.Non ho lavorato con il posizionamento dello schermo di cose prima, quindi l'aiuto è apprezzato.
Se passerò in valori statici arbitrari a setCandidateFrameTopLeft
, viene inserito nello schermo.Le seguenti opere:
[candidates setCandidateFrameTopLeft:NSMakePoint(401, 354)];
.
è un problema del puntatore?
Soluzione
OK, la soluzione a questo è che sono un idiota.Ecco il codice di cui hai bisogno:
NSRect tempRect;
NSDictionary* clientData = [_currentClient attributesForCharacterIndex:0 lineHeightRectangle:&tempRect];
NSPoint windowInsertionPoint = NSMakePoint(NSMinX(tempRect), NSMinY(tempRect));
.
La documentazione per imktextinput attributiFaracracterIndex dice
.Linerect: On Restituisci, un rettangolo che cornica un rettangolo a un pixel con l'altezza della linea.Questo rettangolo è orientato allo stesso modo in cui la linea è orientata.
Ciò significa che restituisce un NSrect nella variabile il tuo passò per il valore
lineHeightRectangle
.Il punto importante è che la posizione di quella NSRECT è la posizione del personaggio che stai cercando.Quindi, allora devi semplicemente creare un punto da quel rettangolo e utilizzare NSminy per il valore Y.Il rettangolo è solo un singolo pixel largo così min / max per x sono fondamentalmente lo stesso.
Altri suggerimenti
Probabilmente non hai più questo problema, ma anche questo funziona, per il futuro:
[candidates show:kIMKLocateCandidatesBelowHint];
.