我有一个我自己创建的自定义框,它是NSBox
的子类。我重写drawRect:
方法并在其中绘制一个渐变(假设我已经有start
& end
颜色):
-(void)drawRect:(NSRect)dirtyRect {
NSGradient *gradient = [[NSGradient alloc] initWithStartingColor:start endingColor:end];
[gradient drawInRect:dirtyRect angle:270];
[gradient release];
}
现在,此框被添加为NSCollectionView
的原型视图的子视图。在视图的原始状态中,它看起来像这样:
将视图滚出视线并再次返回后,它看起来像这样:
为什么我的渐变会像这样被破坏,我该如何解决?谢谢!
答案 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];
}