2012-07-17 60 views
2

我在使用NSScrollView的documentView作为自定义绘图NSView时遇到问题。在nsscrollview中自定义绘图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; 
    } 
} 

Drawing a grid

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

enter image description here

我想这是一个缓存的图像缓冲区或东西,但我不知道为什么发生这种情况,因为我填写覆盖整个帧一个矩形。

是什么原因导致此问题?我该如何解决它?谢谢。

回答

0

基本上,您正在绘制旧内容的顶部。因此,基本上,您需要以某种方式清除它。

一种方法是

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

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

+0

没有为我工作。我有类似的问题(滚动时图像严重损坏)。 – LiMar 2014-02-19 14:52:57

+0

确保你的反应是不可或缺的。 CGRectIntegral()将有所帮助。观点讨厌有分数的反应 – uchuugaka 2014-02-19 23:05:50

0

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

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

我的解决方案是忽略dirtyRect,而是简单地使用self.bounds进行绘制。