2011-08-04 5 views
3

popoverを表示するにはNSViewが必要ですが、NSTextViewの中にキャレットに関連付けられているものはないと思います。キャレットの下にNSPopoverを表示する方法はありますか?NSTextViewのキャレット以下のNSPopover

NSViewを割り当てて、(NSRect)boundingRectForGlyphRange:(NSRange)glyphRange inTextContainer:(NSTextContainer *)containerを使用して配置しようとしましたが、ポップオーバーが表示されません(その理由は、NSRect: {{0, 0}, {0, 0}}を返します)。

+0

NSTextViewは、NSViewの –

+0

@APで、すみません、私はあなたが何を意味するかを理解することはできません。 NSTextViewは明らかにNSViewです。しかし、キャレットはそうではありません。 – Donovan

答えて

10

あなたがまだ回答を探しているかどうかはわかりません。私は最近あなたが説明したような非常に似た機能を必要とするプロジェクトに取り組んでいました。

あなたは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)、これはこのメソッドを役に立たなくします。

NSPopover shows underneath the selected text

+0

ありがとうございます。これは私が必要とするものです。 – Donovan

+0

テキストが大きくなくスクロールする必要がない場合は、正常に機能します。この状況はどうですか? – Akki

+0

@Akki、数ヶ月後に返信して申し訳ありません。私は、このようなことはすべてのケースで機能すると思います。私は楽しみのためにこれを純粋に行うので、私はやってみませんでした:p –

関連する問題