2009-04-19 12 views
0

リセススタイルのNSButtonCellオブジェクトを使用するカスタムスコープバーの作成を試しています。しかし、マウスが動いているときにベゼルを描くことができません。トラッキングエリアを作成して、マウスが入っている間はNOにshowsBorderOnlyWhileMouseInsideを設定し、外側に移動するとYESに設定することで動作させることができますが、これはNSButtonCellが独自にトラッキングを行うので、特にハッキングのようです。カスタムコントロール内の複数のリセスNSButtonCell

コントロールのsetCellメソッドを使用すると、ボタンセルはコントロールのaddTrackingRect:owner:userData:assumeInside:を呼び出し、マウスがホバーしているときにベゼルを描画するように独自のトラッキングを設定します。しかし、同じコントロール内に複数のボタンセルを使用する場合は、ボタンセルのsetControlViewメソッドを使用して各セルのcontrolViewをカスタムコントロールに設定しようとしますが、setCellのようなトラッキングエリアを設定するようにセルを要求しません。

テクニックはNSMatrixがこれを行うために可能でなければなりませんが、利用可能なすべてのAPIとフォーラムを読んだ後、コントロールのsetCellメソッドを使用せずにNSButtonCellの追跡動作を開始する方法が見つかりませんでした。私の額は机の上から殴られて血まみれになっています。

答えて

1

私は後でこれに戻り、カスタムサブクラスをNSViewの代わりにNSControlに変更すると、addTrackingRectメソッドがセルによって自動的に処理されることがわかりました。必要に応じてセルのmouseEntered/mouseExitedメソッドを呼び出して、セルのホバリングモードを実装します。これが誰かを助けることを望みます。

0

最初に、バンド補助剤が最初に役立つかもしれません。 ;)

NSButtonCellの-updateTrackingAreaWithFrame:inView:メソッドを使用してみましたか?これは文書化されていませんが、Leopardでclass-dumpが生成するNSButtonCellヘッダーに表示されます。アンダースコアで始まらない文書化されていないメソッドの使用に関する正式な言葉や一般的な合意が何であるか分かりません。

別の注意:複数のbuttonCellを使用する代わりに、このタスクのビューで複数のボタンを使用することができます。 NSMatrixのような既存のクラスの後で独自のクラスをモデリングすることは素晴らしいことですが、探しているもののような複雑な振る舞いに対しては、少し逸脱するほうがより効果的です。 多くのビューを使用するのではなく、複数のビューを1つのビューで使用するのは高価なものです。にはメリットがありますが、そのルートにハックのある実装が必要な場合は、別の方法があります。

+0

ありがとう、Dirk - 私は完全に同意します。ドキュメンテーションのNSCellの賞賛は、私がボタンを使用したことに対して罪悪感を感じさせたと思う。私はしばらくの間ラットの穴を追いかけると思ったが、これを実装するための満足のいく解決策ではないようだ。 私はupdateTrackingAreaWithFrame:inView:メソッドを試しましたが、そのトリックは行いませんでした。 CocoaがNSButtonを使ってこれを行うときのスタックを見ると、プライベートAPIの束が渡っていることがわかるので、私たちはこれを自分で行うようには見えません。 –

関連する問題