绘制到透明目标会导致绘制工件

时间:2013-12-23 13:50:58

标签: cocoa

我有NSWindow

_window = [[NSWindow alloc] init];
[_window setOpaque:NO];
[_window setBackgroundColor:[NSColor clearColor]];
[_window setStyleMask:NSBorderlessWindowMask];

我的内容视图是我的自定义视图(没有图层):

[_window setContentView:[[MyCustomView alloc] init]];

在我的自定义视图的drawRect:中,我创建了bezier路径,看起来像系统弹出并填充颜色。

- (void)drawRect:(NSRect)dirtyRect
{
    [NSGraphicsContext saveGraphicsState];
    [super drawRect:self.bounds];
    NSBezierPath *path = [self bodyShape];
    [self.backgroundColor setFill];
    [path fill];
    [NSGraphicsContext restoreGraphicsState];
}

所有看起来都很棒first time popover shows
直到我移动popover位置指示器。在窗口中重新绘制后会出现工件,而我的自定义视图的drawRect:会在drawing with artifacts内绘制内容。
当我下次绘制内容时,这个白色三角形(见上图)在窗口中保持相同位置并随窗口移动。Artifact moves with window
如果我添加到我的视图层 - 一切似乎都没问题,但我无法添加图层 如果我用一些纯色填充我的视图,则没有伪影。Fill with solid color
我建议Cocoa缓存第一个位图。但我不确定为什么会发生这种情况以及如何解决这个问题。也许有人知道为什么要修复它? 感谢。

1 个答案:

答案 0 :(得分:2)

我找到了!问题是窗口缓存了地方指示器周围的阴影。我通过调用invalidateShadow的{​​{1}}方法修复了此问题。