2017-11-08 2 views
3

Q&A 1785によれば、-drawFocusRingMaskメソッドと-focusRingMaskBoundsメソッドをオーバーライドするだけの簡単な問題であるコントロールの周りに、適切で現代的なアニメーションのフォーカスリングを描画したいと思います。サブクラス化せずにCocoaフォーカスリングを描画する方法は?

このプロジェクトでは、私はXojoを使用する必要があります。これは、Cocoaメソッドを宣言して呼び出すことができますが、自分自身のビューサブクラスを実際に作成する機会は与えません。

実際のサブクラスを作成せずに適切なフォーカスリングを取得する方法はありますか?この10.7のテクニカルノートの後に、おそらく導入された他の方法があります。または、実行時に既存のクラスにメソッドを挿入するためのいくつかの不正な方法ですか?

+0

Xojoは['class_addMethod()'](https://developer.apple.com/documentation/objectivec/1418901-class_addmethod?language=objc)(←クリック可能)のようなlibobjc関数を使用できますか? – hidefromkgb

+0

これはあなたが追加したカスタムのCocoaコントロールですか?私はあなたがMBSのプラグインを使ってこれを行うなら、計画していることをすることなくNSControlのfocusRingプロパティを切り替えることもできると思います。私は自分のアプリで数回これをやった。 –

+0

TextAreaコントロールの周りにフォーカスリングを取得します。 MBSプラグインの必要性を避けるために願っています。 –

答えて

2

オプションのプロトコルメソッドを追加する場合は、class_addMethod()が適切でしょう。 public macoslibプロジェクトには、その名前を検索するだけで、それを行う方法を示すコードがいくつかあります。

ただし、機能が既に実装されている場合は、別の機能を追加することはできません。その場合、メソッドスウィズルが解決策です。セレクタのファンクションアドレスを別のファンクションアドレスに置き換え、元のものを呼び出すのは一般的な方法です。

私はそれを手にしたとしてもXojoの例はないようです。

更新標準ココアについて

が最も簡単な解決策を制御するには、(macoslibで利用可能)NSViewfocusRingType応じて設定することです。 drawFocusRingMaskの実装は、カスタムコントロールでのみ必要です。

+0

これは有望ですが、これまでのところ私はそれを働かせることができません。私はTextAreaのクラス(これは副次的にXOJScrollViewと呼ばれます)でclass_addMethodを呼び出し、Q&Aに示すようにdrawFocusRingMaskとfocusRingMaskBoundsの両方を実装に追加できましたが、フォーカスリングはまだありません。 –

+0

また、ビュー階層(XOJScrollViewにはXOJTextViewを含むNSClipViewが含まれており、XOJScrollViewにはNSScrollerも含まれています)を深く参照し、これらのメソッドをXOJTextViewに追加しました。再び追加は成功しましたが、フォーカスリングは表示されません。 –

+0

この場合、focusRingTypeの設定で十分であることが確認されました。私はこのケースではうまくいかないという誤った信念のもとで働いていました。 –

関連する問題