2

我有一个我制作的自定义框,它是NSBox. 我覆盖该drawRect:方法并像这样在其中绘制渐变(假设我已经有一个startend颜色):

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

反而。

进一步说明:看起来您的渐变对象可以被缓存而不是在内部创建/释放-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 回答