Вопрос

Я использую набор методов ввода и пытаюсь разместить окно под текстом.

_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 переменная в порядке, когда я отлаживаю, я вижу ее значение, например:НСпоинт:{647,365}

Однако когда я использую это, окно кандидата просто отображается в левом нижнем углу экрана.Раньше я не работал с размещением материалов на экране, поэтому буду благодарен за помощь.

Если я передам произвольные статические значения в setCandidateFrameTopLeft, он помещается на экран.Следующие работы:

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

Это проблема указателя?

Это было полезно?

Решение

Хорошо, решение в том, что я идиот.Вот код, который вам нужен:

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

Документация для Атрибуты IMKTextInputForCharacterIndex говорит

линияРект:При возврате — прямоугольник, обрамляющий прямоугольник шириной в один пиксель высотой строки.Этот прямоугольник ориентирован так же, как ориентирована линия.

Это означает, что он возвращает NSRect в переменную, которую вы передали для lineHeightRectangle ценить.Важным моментом является то, что местоположение этого NSRect — это местоположение персонажа, которого вы ищете.Итак, вам нужно просто выделить точку из этого прямоугольника и использовать NSMinY для значения Y.Ширина прямоугольника составляет всего один пиксель, поэтому значения Min/Max для X практически одинаковы.

Другие советы

Вероятно, у вас больше нет этой проблемы, но это тоже работает в будущем:

            [candidates show:kIMKLocateCandidatesBelowHint];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top