あなたがまだ回答を探しているかどうかはわかりません。私は最近あなたが説明したような非常に似た機能を必要とするプロジェクトに取り組んでいました。
あなたはNSTextViewのサブクラス内で次の操作を行うことができます。
お電話しようとしている機能は次のとおりです。showRelativeToRect:画像観察:preferredEdge:RECTはNSTextView内部矩形になります
、使用してNSTextView座標系では、ofViewは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];
これが結果です。
システム関数を使用して変換する方法がある場合、私はconvertRect:toViewを試しましたが、このメソッドはデリゲートで記述されているため、NSTextViewは常に( 0,0)、これはこのメソッドを役に立たなくします。
NSTextViewは、NSViewの –
@APで、すみません、私はあなたが何を意味するかを理解することはできません。 NSTextViewは明らかにNSViewです。しかし、キャレットはそうではありません。 – Donovan