質問: drawRect:setNeedsDisplayの後に必ずしも呼び出されるとは限りません:親ビューがレイヤーバックされている場合はYES `drawRect:`をオーバーライドして(図の目的で)赤い背景を描画するカスタム `NSCollectionView` を持つ基本的なCocoaアプリケーションがあります。 私は `setNeedsDisplay:YES` を呼び出したにもかかわらず、無作為な時間に `drawRect:`が呼び出されないことに気付きました。それがうまくいけばコレクションビューは赤い背景を持っていました。 私は数時間かかりましたが、最後に、親ビューのビュー階層の1つが**レイヤーバックアップビュー**(Interface Builderで「Core Animation Layer」をチェックしていました要素に影を追加する)。 その親ビューをレイヤーバックを使用しないように変更するとすぐに問題が解決され、 `drawRect:`は常に期待どおりに呼び出されます。 私が困惑しているのは、親ビューでレイヤーバッキングを有効にした場合、 `drawRect:`が呼び出されることがあります。 親ビューがレイヤーバックされている場合、 `drawRect:`を任意のサブビューで確実に上書きできないと仮定するべきですか?
回答: レイヤーバックビューのWWDC 2012ビデオを見て、 `-layerContentsRedrawPolicy` のドキュメントを読んでください。 `NSViewLayerContentsRedrawOnSetNeedsDisplay` のように聞こえます。