Frage

Ich verwende das Inputmethodkit und versuche, ein Fenster unter einem Text zu platzieren.

_currentClient ist ein IMKTextInput Beispiel

Kandidaten ist ein IMKCandidates Beispiel

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

Jetzt weiß ich, dass die windowInsertionPoint Variable ist in Ordnung, wenn ich debugge, kann ich ihren Wert sehen, z. B.:NSPunkt:{647.365}

Wenn ich dies verwende, wird das Kandidatenfenster jedoch nur in der unteren linken Ecke des Bildschirms angezeigt.Ich habe noch nie mit der Bildschirmplatzierung von Dingen gearbeitet, daher bin ich für Hilfe dankbar.

Wenn ich beliebige statische Werte an übergebe setCandidateFrameTopLeft, wird es auf dem Bildschirm platziert.Folgendes funktioniert:

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

Handelt es sich um ein Zeigerproblem?

War es hilfreich?

Lösung

OK, die Lösung hierfür ist, dass ich ein Idiot bin.Hier ist der Code, den Sie benötigen:

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

Die Dokumentation für IMKTextInput attributesForCharacterIndex sagt

lineRect:Bei der Rückgabe ein Rechteck, das ein ein Pixel breites Rechteck mit der Höhe der Linie umrahmt.Dieses Rechteck ist genauso ausgerichtet wie die Linie.

Dies bedeutet, dass ein NSRect in die Variable zurückgegeben wird, für die Sie es übergeben haben lineHeightRectangle Wert.Der wichtige Punkt ist, dass der Speicherort dieses NSRect der Speicherort des Zeichens ist, nach dem Sie suchen.Dann müssen Sie einfach einen Punkt aus diesem Rechteck machen und NSMinY für den Y-Wert verwenden.Das Rechteck ist nur ein einziges Pixel breit, daher sind Min/Max für X grundsätzlich gleich.

Andere Tipps

Sie haben dieses Problem wahrscheinlich nicht mehr, aber das funktioniert auch für die Zukunft:

            [candidates show:kIMKLocateCandidatesBelowHint];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top