1

inputmethodkit を使用して、テキストの下にウィンドウを配置しようとしています。

_currentClient はIMKTextInputインスタンスです

候補は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];

これで、windowInsertionPoint変数に問題がないことがわかりました。デバッグすると、値が表示されます。たとえば、NSPoint: {647,365} です。

ただし、これを使用すると、候補ウィンドウが画面の左下隅に表示されます。私は前にものの画面配置を扱ったことがないので、助けていただければ幸いです。

に任意の静的な値を渡すとsetCandidateFrameTopLeft、画面に配置されます。以下の作品:

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

ポインターの問題ですか?

4

2 に答える 2

1

OK、これに対する解決策は私がばかだということです。必要なコードは次のとおりです。

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

IMKTextInputattributesForCharacterIndexのドキュメントによると

lineRect:戻ると、1ピクセル幅の長方形を線の高さで囲む長方形。この長方形は、線の方向と同じ方向に向けられています。

これは、値として渡した変数にNSRectを返すことを意味しますlineHeightRectangle。重要な点は、そのNSRectの場所が、検索しているキャラクターの場所であるということです。したがって、その長方形からポイントを作成し、Y値にNSMinYを使用する必要があります。長方形の幅は1ピクセルしかないため、Xの最小/最大は基本的に同じです。

于 2012-05-19T00:58:25.360 に答える
0

おそらくこの問題はもう発生していませんが、これは将来的にも機能します。

            [candidates show:kIMKLocateCandidatesBelowHint];
于 2014-02-09T21:45:18.547 に答える