2011-06-24 33 views
2

NSBoxのサブクラスであるカスタムボックスがあります。私は(私はすでにstart & end色を有すると仮定して)drawRect:メソッドをオーバーライドし、このようにそれの勾配を描く:NSScrollViewがNSGradientを破棄する(破損)

-(void)drawRect:(NSRect)dirtyRect { 
    NSGradient *gradient = [[NSGradient alloc] initWithStartingColor:start endingColor:end]; 
    [gradient drawInRect:dirtyRect angle:270]; 
    [gradient release]; 
} 

今、このボックスはNSCollectionViewのプロトタイプ・ビューのサブビューとして追加されます。ビューの元の状態では、次のようになります。

enter image description here

そして視界の外のビューをスクロールした後にして再度で、それは次のようになります。

enter image description here

なぜ私の勾配がありますそのように腐敗して、どうすれば修正できますか?ありがとう!

答えて

1

あなたの問題は、ボックスの矩形全体ではなく、dirtyFrameです。私はこれが正しいかどうかわかりませんが、これを試してみてください。dirtyRect引数は、必ずしもボックス全体を表すものではありません

-(void)drawRect:(NSRect)dirtyRect { 
    NSGradient *gradient = [[NSGradient alloc] initWithStartingColor:start endingColor:end]; 
    [gradient drawInRect:[self bounds] angle:270]; 
    [gradient release]; 
} 
+0

あなたは賞金を獲得します。 '[gradient drawInRect:[self bounds] angle:270];を呼び出すだけで問題は解決しました。ありがとう!私はそれが利用可能なときにそれを受け入れるよ。 –

+0

私はそれを '[self frame]'ではなく '[self bounds]'に更新します。 – icktoofay

+0

よろしくお願いします。私はあなたにBavariousに尋ねたのと同じ質問をします。つまり、drawRectの代わりにこれを描画する場所がありますか? –

3

こと。 Cocoaは元のフレームのサブフレームのみが描画を必要とすると判断した場合、dirtyRectはそのサブフレームのみを表します。フレーム全体にグラデーションを描画してから、サブフレームに同じグラデーションを描画すると、一致しない可能性が高くなります。

試してみてください。代わりに

[gradient drawInRect:[self bounds] angle:270]; 

さらに1つの注意:グラデーションオブジェクトは、-drawRect:の中に作成/解放される代わりにキャッシュされるようです。

+0

あなたが投稿したときに私はそれを理解しました。ありがとう! –

関連する問題