在动画期间的半透明NSTableView背景图画臭虫

时间:2014-08-19 07:21:51

标签: objective-c cocoa core-animation osx-mavericks nstableview

我有一个基于视图的NSTableView,背景为半透明。这种方法很好,除了在行动画中。如果我为NSTableView背景使用完全不透明的颜色,那么没有问题。这是一个显示问题的GIF:

http://gfycat.com/ChillyVigorousChamois

正如gif所示,在动画期间,背景闪烁的红色应该是应该的。如果仔细观察,实际上会有一部分背景正确绘制,向下滑动以适应新添加的行。

NSScrollView后面的NSTableView是纯白色,由此代码设置:

-(void) awakeFromNib {
    self.drawsBackground = YES;
    self.backgroundColor = [NSColor whiteColor];
}

NSTableView有50%透明的红色背景,如下代码所示:

-(BOOL) isOpaque {
    return NO;
}

- (void)drawBackgroundInClipRect:(NSRect)clipRect {
    [[[NSColor redColor] colorWithAlphaComponent:0.5] setFill];
    NSRectFillUsingOperation(clipRect, NSCompositeSourceOver);
}

使用以下代码对行进行动画处理:

[_tableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:insertRange]
                  withAnimation:NSTableViewAnimationSlideLeft];

我现在最好的猜测是,因为在动画期间背景被重复地绘制在自身的顶部,所以会发生变暗。在过去,我通过将父视图添加到NSAnimation来修复类似的错误,这迫使它与动画儿童一起重复重绘。在这种情况下,我不确定如何做同样的事情。

任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

这并不能解决问题,但这是一种解决方法。诀窍是将整个NSScrollView置于自定义NSView内,并在自定义NSView中绘制背景。

NSTableView透明:

@implementation SJTableView
- (BOOL)isOpaque {
    return NO;
}

-(void) drawBackgroundInClipRect:(NSRect)clipRect {
    NSRectFillUsingOperation(clipRect, NSCompositeClear);
}
@end

NSScrollView透明:

_scrollView.drawsBackground = NO;

在自定义视图中绘制背景:

@implementation SJView
-(BOOL) isOpaque {
    return (_backgroundColor.alphaComponent >= 1.0);
}

-(void) drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];

    if(_backgroundColor){
        [_backgroundColor setFill];
        NSRectFillUsingOperation(dirtyRect, NSCompositeSourceOver);
    }
}
@end