Question

Je suis l'aide de la inputmethodkit et essayer de placer une fenêtre en dessous du texte.

_currentClient est un IMKTextInput exemple

candidats est une IMKCandidates exemple

// 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];

Maintenant, je sais que le windowInsertionPoint variable est très bien, quand je debug je peux voir, c'est la valeur, par exemple:NSPoint:{647,365}

Cependant quand je l'utilise, le candidat de la fenêtre affiche dans le coin inférieur gauche de l'écran.Je n'ai pas travaillé avec l'emplacement de l'écran de trucs avant, de sorte que l'aide est appréciée.

Si je passe dans l'arbitraire des valeurs statiques de setCandidateFrameTopLeft, il est placé dans l'écran.Les ouvrages suivants:

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

Est-ce un problème de pointeur?

Était-ce utile?

La solution

OK, la solution à cela est que je suis un idiot.Voici le code dont vous avez besoin:

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

La documentation pour IMKTextInput attributesForCharacterIndex dit

lineRect:Sur le retour, un rectangle qui encadre un pixel de large rectangle avec la hauteur de la ligne.Ce rectangle est orientée de la même manière, la ligne est orientée.

Cela signifie qu'il renvoie un NSRect dans la variable de votre passé pour la lineHeightRectangle de la valeur.Le point important est que l'emplacement de cette NSRect est l'emplacement du caractère que vous recherchez.Oui, alors vous avez juste besoin de faire un point à partir d'un rectangle et d'utiliser NSMinY pour la valeur y.Le rectangle est un seul pixel de large, de sorte Min/Max de X sont fondamentalement les mêmes.

Autres conseils

Vous n'avez probablement pas ce problème, mais cela fonctionne aussi pour l'avenir:

            [candidates show:kIMKLocateCandidatesBelowHint];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top