Размещение окон NSPoint и IMKCandidate
-
11-12-2019 - |
Вопрос
Я использую набор методов ввода и пытаюсь разместить окно под текстом.
_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];