最近、カスタム NSButtonCell サブクラスの問題に遭遇しました。白いテキストの暗いインターフェイスがあり、デフォルトのボタンを作成しようとするまで(つまり、に相当するキーを割り当てるまで)、すべてが期待どおりに進んでいます\r
。私たちが得たものは不思議に思えます: ベゼルは描画しますが、テキストは描画しません. しかし、テキストを黒にすると、描画されます。黒い影でテキストを白くすると、影だけが描画されます!
テキストをひばりに設定してテストしてみると、謎が解け始めました[NSColor redColor]
。(ここでの「作成」ボタンには\r
、「キャンセル」は に相当するキーがありEsc
ます。)
私が最終的に理解したのは、デフォルトのボタンのセルがビットマップ コンテキストに描画されていることです。おそらく、レンダリングされたグリフをキャッシュして、Aqua の外観が与えるアニメーション化された青いパルスの背景を実現できるようにするためです。これはまったく理にかなっていますが、驚いたことに、そのビットマップは乗算合成操作で描画されます。したがって、黒が表示され、白は表示されず、その間にあるものは暗く表示されます。
テキストのレンダリングを削除して代わりに-drawTitle:withFrame:inView:
実行することで、回避策をハックすることができました。-drawBezelInFrame:inView:
ただし、これは繰り返し呼び出されるため、画像を手動でキャッシュする必要があります。さらに、タイトルをレンダリングする方法が特に間違っているため、概念的に醜いだけです!
私の質問: 確かにもっと良い方法があるはずですよね? ボタンがデフォルトであっても、このオフスクリーン レンダリング パスを自動的に使用しないようにボタン セルに指示する方法はありますか?