我有一个基于视图的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来修复类似的错误,这迫使它与动画儿童一起重复重绘。在这种情况下,我不确定如何做同样的事情。
任何想法如何解决这个问题?
答案 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