我在使用NSScrollView的documentView自定义绘制NSView时出现问题。
这是我的drawRect:代码:
- (void)drawRect:(NSRect)dirtyRect
{
[[NSColor lightGrayColor] set];
NSRectFill(self.frame); // Fill entire frame
[[NSColor grayColor] set];
[NSBezierPath setDefaultLineWidth:1];
float y = 0.0f;
while (y <= self.frame.size.height) {
[NSBezierPath strokeLineFromPoint:NSMakePoint(0.0f, y) toPoint:NSMakePoint(self.frame.size.width, y)];
y += 50.0f;
}
float x = 0.0f;
while (x <= self.frame.size.width) {
[NSBezierPath strokeLineFromPoint:NSMakePoint(x, 0.0f) toPoint:NSMakePoint(x, self.frame.size.height)];
x += 50.0f;
}
}
向右滚动视图时一切正常,但当我向左滚动视图时,我看到奇怪的线条。
我认为这是一个缓存的图像缓冲区或其他东西,但我无法理解为什么会发生这种情况,因为我填充了一个覆盖整个帧的矩形。
是什么导致了这个问题?我该如何解决?感谢。
答案 0 :(得分:0)
基本上,您正在使用旧内容。 所以,基本上,你需要以某种方式清除它。
一种方法是
[[NSColor clearColor] set];
NSRectFill(_bounds);
您可能想要更精确或更精确的东西。
答案 1 :(得分:0)
我知道这是一个老问题,但我遇到了同样的问题,我设法修复了它。
drawRect
方法有一个参数,(CGRect) dirtyRect
。我的错误在于我使用dirtyRect来检查要绘制的边界,就像在iOS上一样。但我发现这个CGRect被称为“脏”&#39;因为某种原因。它指定操作系统要求您重绘的区域。这有时不是NSView的整个框架,而是它的一部分。这使您可以制作真正快速优化的代码,而不仅仅需要绘制更多代码。
我的解决方案是忽略dirtyRect
,而只是使用self.bounds
进行绘制。