Cocoaアプリ(OS X Yosemite)でモーダルウィンドウがシートとして表示されている間、メインウィンドウを暗くするためのシェードとして使用している半透明のNSViewがあります。
分離されたサンプル プロジェクトについては、以下の「更新」セクションを参照してください。
シェードは適切に表示されますが、ビュー階層の下位にある他のコンポーネントをオーバーレイする場所では、それらのコンポーネントの背景が表示され、半透明でレンダリングされます (完全に透明なままである必要があります)。
上のスクリーンショットでは、進行状況インジケーター (小さな四角形) と NSTextField (ラベル) の半分を陰で覆っているのがわかります。シートがカバーしている半分は、背景で正しくレンダリングされません。残りの半分は正常にレンダリングされます。
ビュー階層の下位にあるコンポーネントは、ブレンディング モード Behind Window、マテリアル Light、および外観 Vibrant Light に設定され、setWantsLayer が true に設定された NSVisualEffectView にあります。
レイヤーベースの NSVisualEffectViews と NSViews の間のコンポジションの相互作用について、何かが欠けていると感じています。
私はまだ Cocoa の複雑さに慣れていないので、間違ったレンダリングの原因について考えていただければ幸いです。ありがとう!
アップデート
問題を実証するために、簡単に分離されたテストケースを作成しました。ここから複製できます。
また、アルファ付きの画像 (コーナー インジケーター) とアルファなしの画像 (星) で発生する問題も示しています。
回避策
Daniel Chote (ツイートを参照)のおかげで回避策は、すべてのコンポーネントで背景色を透明に手動で設定することです。ダニエルが言及しているように、「恐ろしい解決策」ですが、少なくとも解決策です:)
(まだ機能しない理由について頭を悩ませる前に、Draws Background をオンにすることを忘れないでください。) :)
誰かがより良い解決策を持っているなら、私はすべて耳にします。少し待って、何も聞こえない場合は、レーダーを提出します。