2

我在将自定义绘图 NSView 用作 NSScrollView 的 documentView 时遇到问题。

这是我的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;
    }
}

绘制网格

当我向右滚动视图时一切正常,但是当我向左滚动视图时我看到奇怪的线条。

在此处输入图像描述

我认为这是一个缓存的图像缓冲区或其他东西,但我不明白为什么会发生这种情况,因为我填充了一个覆盖整个帧的矩形。

是什么导致了这个问题?我该如何解决?谢谢。

4

2 回答 2

1

我知道这是一个老问题,但我刚刚遇到了同样的问题,我设法解决了它。

drawRect方法有一个参数, a (CGRect) dirtyRect。我的错误是我使用了dirtyRect 来检查要绘制的边界,就像在iOS 上一样。但我发现这个 CGRect 被称为“脏”是有原因的。它指定操作系统希望您重绘的区域。这有时不是 NSView 的整个框架,而是它的一部分。这使您可以制作真正快速优化的代码,并且不会绘制超出其必须绘制的内容。

我的解决方案是忽略dirtyRect,而只是简单地self.bounds用于绘图。

于 2014-04-21T11:07:37.957 回答
0

基本上,您是在旧内容之上绘制的。所以,本质上,你需要以某种方式清除它。

一种方法是

[[NSColor clearColor] set];
NSRectFill(_bounds);

你可能想要更精确的东西。

于 2014-02-19T03:23:45.143 回答