2

のサブクラスであるカスタムボックスを作成しましたNSBox。メソッドをオーバーライドして、次のdrawRect:ようにグラデーションを描画します(すでにstartendcolorがあると仮定します)。

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

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

ここに画像の説明を入力してください

ビューをスクロールして見えなくなってから元に戻すと、次のようになります。

ここに画像の説明を入力してください

グラデーションがそのように破損するのはなぜですか?どうすれば修正できますか?ありがとう!

4

2 に答える 2

3

そのdirtyRect引数は、必ずしもボックス全体を表すわけではありません。元のフレームのサブフレームのみを(再)描画する必要があるとCocoaが判断した場合は、dirtyRectそのサブフレームのみを表します。フレーム全体にグラデーションを描画してから、サブフレームに同じグラデーションを(再)描画した場合、それらが一致しない可能性があります。

試す:

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

代わりは。

さらにもう1つ注意してください。グラデーションオブジェクトは、内部で作成/リリースする代わりにキャッシュできるよう-drawRect:です。

于 2011-06-24T04:05:27.570 に答える
1

問題はdirtyFrame、ボックスの長方形全体ではなく、描画していることです。これが正しいかどうかはわかりませんが、これを試してください:

-(void)drawRect:(NSRect)dirtyRect {
    NSGradient *gradient = [[NSGradient alloc] initWithStartingColor:start endingColor:end];
    [gradient drawInRect:[self bounds] angle:270];
    [gradient release];
}
于 2011-06-24T04:04:44.687 に答える