Я не уверен, что вы все еще ищете ответ. Недавно я работал над проектом, который нуждается в очень похожей функции, как вы описали.
Вы можете сделать следующее внутри подкласса NSTextView:
функция, которую вы собираетесь назвать это: showRelativeToRect: ofView: preferredEdge:
Прямоугольник будет прямоугольник внутри NSTextView, используя Система координат NSTextView, theView - это NSTextView, а preferredEdge - это край, к которому вы хотите привязать эту вещь.
Теперь вы говорите, что хотите, чтобы объект PopOver показывался под кареткой, ну, вы должны дать ему Rect, Point недостаточно. В NSTextView есть селектор, называемый selectedRange, который дает вам диапазон выделенного текста, вы можете использовать его для поиска вашей каретки.
Следующим направлением является вызов firstRectForCharacterRange (класс должен делегировать NSTextInputClient), этот метод вернет координату экрана выделенного текста внутри NSTextView, затем вы преобразуете их в систему координат NSTextView, вы сможете показать вещь NSPopover в правильном положении. Вот мой код этого.
NSRect rect = [self firstRectForCharacterRange:[self selectedRange]]; //screen coordinates
// Convert the NSAdvancedTextView bounds rect to screen coordinates
NSRect textViewBounds = [self convertRectToBase:[self bounds]];
textViewBounds.origin = [[self window] convertBaseToScreen:textViewBounds.origin];
rect.origin.x -= textViewBounds.origin.x;
rect.origin.y -= textViewBounds.origin.y;
rect.origin.y = textViewBounds.size.height - rect.origin.y - 10; //this 10 is tricky, if without, my control shows a little below the text, which makes it ugly.
NSLog(@"rect %@", NSStringFromRect(rect));
NSLog(@"bounds %@", NSStringFromRect([self bounds]));
if([popover isShown] == false)
[popover showRelativeToRect:rect
ofView:self preferredEdge:NSMaxYEdge];
и это результат.
Все, что мне интересно, это то, что если есть способ конвертировать с использованием системных функций, хотя я попытался преобразоватьRect: toView, но поскольку этот метод написан в делегате, NSTextView всегда имеет систему координат (0,0), что делает этот метод бесполезным.
NSTextView является NSView –
@AP, мне очень жаль, что я не могу понять, что вы имеете в виду. NSTextView - это, очевидно, NSView. Но карет - нет. – Donovan