間もなく登場する OSX 10.10 ("Yosemite") は、新しいタイプのビューである NSVisualEffectView を提供します。これは、窓越しまたは窓内の半透明性をサポートします。私は主に窓越しの半透明性に関心があるので、この質問ではそれに焦点を当てますが、窓内の半透明性にも当てはまります。
10.10 で透過的な透過性を使用するのは簡単です。NSVisualEffectView
ビュー階層のどこかに を配置し、 に設定するだけblendingMode
ですNSVisualEffectBlendingModeBehindWindow
。それだけです。
10.10 では、IB で を定義NSVisualEffectView
し、それらのブレンド モード プロパティを設定するだけで、すぐに実行できます。
ただし、以前の OSX バージョンとの下位互換性を維持したい場合は、それができません。XIB に を含めようNSVisualEffectView
とすると、XIB をロードしようとするとすぐにクラッシュします。
10.10 で実行すると透過性を提供し、以前の OS バージョンで実行すると不透明なビューに単純に劣化する「設定して忘れる」ソリューションが必要です。
これまでに行ったことは、問題のビューを XIB の通常の NSView にしてから、(awakeFromNib によって呼び出される) をチェックするコードを追加することです[NSVisualEffectView class] != nil
。クラスが定義されたら、NSVisualEffectView のインスタンスを作成します。現在のビューのすべてのサブビューを新しいビューに移動し、所定の位置にインストールします。これは機能しますが、半透明のビューが必要になるたびに記述しなければならないカスタム コードです。
NSProxy オブジェクトを使用すると、これが可能になる可能性があると考えています。これが私が考えていることです:
NSView のカスタム サブクラスを定義します (MyTranslucentView と呼びましょう)。すべての init メソッド (initWithFrame および initWithCoder) で、新しく作成されたオブジェクトを破棄し、代わりにプライベート インスタンス変数 (myActualView) を持つ NSProxy のサブクラスを作成します。初期化時に、OS>=10.10 の場合は myActualView オブジェクトを NSVisualEffectView として作成し、OS<10.10 では通常の NSView を作成することを決定します。
プロキシは、すべてのメッセージを myActualView に転送します。
これはかなりの面倒で低レベルのコードですが、うまくいくはずです。
誰かがこのようなことをしましたか?もしそうなら、あなたは私を正しい方向に向けるか、私に何か指針を与えることができますか?
Apple はYosemiteとの Beta 契約で、以前の Beta 契約よりもはるかにオープンです。これについて一般的な用語で話すことで、ベータNDAに違反しているとは思いませんが、実際に使用するコードNSVisualEffectView
はおそらくNDAの下で共有する必要があります...