4

内部にさまざまな要素 (画像、さまざまなテキスト) を含むカスタム NSCell があり、それらのテキスト ブロックの 1 つにさまざまなクリック可能なリンクが含まれている場合があります。NSAttributedString でリンクを正しく識別して青色に着色していますが、カーソルを手に変えてユーザーが実際にクリックできるようにする方法がわかりません。

現在、属性付きの文字列がセルに直接描画されていますが、これは明らかにクリックできませんが、NSCell は NSView を継承していないため、他の方法で追加する方法がわかりません。通常、サブビューとして NSTextField を追加するだけですが、この場合はそのようにはできません。

何かご意見は?

4

2 に答える 2

2

私が考えることができる唯一の解決策は、NSCell 内で手動のヒット テストとマウス トラッキングを使用することです。最も難しい部分 (私には答えがありません) は、リンク テキストの四角形を決定する方法です。うまくいけば、誰かがそれに答えることができますか?

URL テキストの rect がわかれば、hitTestForEvent を実装してクリック アクションを実装できます。このようなことをすると思います。

// If the event is a mouse down event and the point is inside the rect trigger the url 
- (NSUInteger)hitTestForEvent:(NSEvent *)event inRect:(NSRect)frame ofView:(NSView *)controlView {
   NSPoint point = [controlView convertPoint:[event locationInWindow] fromView:nil];
// Check that the point is over the url region
   if (NSPointInRect(point, urlFrame)) {
       // If event is mousedown activate url
       // Insert code here to activate url
       return NSCellHitTrackableArea;
   } else {
    return [super hitTestForEvent:event inRect:frame ofView:controlView];
   }
}
于 2009-09-09T08:24:41.350 に答える
2

Ira Cooke や他の人々との話し合いに基づいて、次の解決策を採用することにしました。

  • NSCell に直接描画する
  • マウスが NSCell に入ると、ホバーされた NSCell と同じ位置でカスタム NSView サブビューを NSTableView にすぐに追加します。
  • 彼らのデザインはピクセルごとに一致しているため、識別可能な違いはありません
  • この NSView には NSTextView (またはフィールド、未定) があり、属性付きの文字列とリンクが表示され、クリック可能になります。
  • NSCell の外にホバーすると、そのミラー NSView が破棄されます

すべてが計画どおりに進む場合、一度に NSTableView にアタッチされる NSView は 1 つだけで、ほとんどの場合はまったくありません。作業が完了したら、戻ってきて結果を報告します。

于 2009-09-10T01:36:09.693 に答える