【问题标题】:NSScrollView messes up NSGradient (corruption)NSScrollView 搞砸了 NSGradient(损坏)
【发布时间】:2011-06-24 03:57:55
【问题描述】:

我制作了一个自定义框,它是NSBox 的子类。我重写了drawRect: 方法并像这样在其中绘制渐变(假设我已经有startend 颜色):

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

现在这个框被添加为NSCollectionView 的原型视图的子视图。在视图的原始状态下,它看起来像这样:

在将视图滚动到视线之外并再次返回后,它看起来像这样:

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

【问题讨论】:

    标签: objective-c cocoa nsgradient


    【解决方案1】:

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

    试试:

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

    改为。

    进一步说明:看起来您的渐变对象可能会被缓存,而不是在 -drawRect: 中创建/释放。

    【讨论】:

    • 我在你发帖的时候就知道了。谢谢!
    【解决方案2】:

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

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

    【讨论】:

    • 你赢了。只需致电[gradient drawInRect:[self bounds] angle:270]; 即可解决问题。谢谢!有空我会接受的。
    • 我想我会将其更新为 [self bounds] 而不是 [self frame]
    • 好的。我会问你和 Bavarious 一样的问题,即有没有比drawRect: 更好的地方来绘制这个?
    • @sudo:可能不会。据我所知,只有在视图的先前隐藏部分被显示时才会调用它,例如当您将其滚动回视图时。如果它在视图内滚动或滚动出来但没有返回,我认为它不会被调用,所以它应该是相当有效的。
    猜你喜欢
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 2010-10-15
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多