NSScrollView搞砸了NSGradient(腐败)

时间:2011-06-24 03:57:55

标签: objective-c cocoa nsgradient

我有一个我自己创建的自定义框,它是NSBox的子类。我重写drawRect:方法并在其中绘制一个渐变(假设我已经有start& end颜色):

-(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

为什么我的渐变会像这样被破坏,我该如何解决?谢谢!

2 个答案:

答案 0 :(得分:3)

dirtyRect参数不一定代表整个框。如果Cocoa决定只有原始帧的子帧需要(重新)绘制,则dirtyRect仅表示该子帧。如果您为整个帧绘制了一个渐变,然后(重新)为子帧绘制相同的渐变,则可能它们不匹配。

尝试:

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

代替。

还有一点需要注意:看起来您的渐变对象可能会被缓存,而不是在-drawRect:内创建/发布。

答案 1 :(得分:1)

您的问题是您正在使用dirtyFrame,而不是整个框的矩形。我不知道这是否正确,但试试这个:

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