NSPOINTとIMKCANDIDATEウィンドウの配置
-
11-12-2019 - |
質問
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];
.
今、私はDEBUGをデバッグするときにwindowInsertionPoint
変数が大丈夫であることを知っています、例えば:nspoint:{647,365}
しかしこれを使用すると、候補ウィンドウは画面の左下隅に表示されます。私は以前のもののスクリーンの配置と働いていないので、助けが高く評価されています。
setCandidateFrameTopLeft
に任意の静的値を渡すと、画面に配置されます。以下の作品:
[candidates setCandidateFrameTopLeft:NSMakePoint(401, 354)];
.
ポインタ問題は?
解決
OK、これへの解決策は私が馬鹿であるということです。これが必要なコードです:
NSRect tempRect;
NSDictionary* clientData = [_currentClient attributesForCharacterIndex:0 lineHeightRectangle:&tempRect];
NSPoint windowInsertionPoint = NSMakePoint(NSMinX(tempRect), NSMinY(tempRect));
.
IMKTextInput AttributesForCharacterIndex
Linerect:returnでは、ラインの高さを持つ1ピクセル幅の矩形をフレームにする長方形。この長方形は、線が向きを置いているのと同じ方法です。
これは、
lineHeightRectangle
値の渡した変数へのNSRECTを返すことを意味します。重要な点は、そのNSRECTの場所が検索している文字の場所であることです。それで、あなたはその長方形からポイントを作り、y値のためにnsminyを使う必要があります。四角形は単一のピクセルだけであるため、Xの最小/最大は基本的に同じです。
他のヒント
あなたはおそらくもうこの問題を持っていませんが、これは将来のためにも機能します:
[candidates show:kIMKLocateCandidatesBelowHint];
. 所属していません StackOverflow