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

好的,解决这个问题的方法是我是个白痴。这是您需要的代码:

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

IMKTextInput attributesForCharacterIndex的文档说

lineRect:返回时,一个矩形框出一个像素宽的矩形,其高度与线的高度相同。这个矩形的方向与线的方向相同。

这意味着它将一个 NSRect 返回到您为该lineHeightRectangle值传递给它的变量中。重要的一点是,该 NSRect 的位置就是您要搜索的字符的位置。因此,您只需从该矩形中创建一个点并使用 NSMinY 作为 Y 值。矩形只有一个像素宽,因此 X 的 Min/Max 基本相同。

于 2012-05-19T00:58:25.360 回答
0

您可能不再有这个问题,但这也适用于未来:

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