NSScrollView在每个帧的自定义视图上调用drawRect

时间:2014-04-23 16:58:14

标签: objective-c macos nsscrollview

我有很多iOS经验,但我是MacOS开发的新手。

我正在使用NSScrollView滚动NSView的自定义子类的多个实例。此自定义子类具有自定义drawRect实现。因此,一次显示此子类的多个实例(甚至可以最多100个实例)。

一切正常,但当我滚动时,我注意到它没有顺利完成。通过在NSLog()实现中放置drawRect语句,我很快发现它在滚动期间被称为每帧

我在iOS上习惯的是,drawRect被调用一次,除非您通过调用setNeedsDisplay提出要求,否则不会重新绘制内容。

我希望通过在滚动期间不要让我的自定义NSView重绘很多次来提高我的NSScrollView的性能,而是记住最后绘制的内容。怎么办呢?

3 个答案:

答案 0 :(得分:3)

我想出了一种让它只绘制一次的方法!我现在使用NSImage来绘制所有内容。我只在模型改变时再次这样做。

buffer = [[NSImage alloc] initWithSize:self.bounds.size];
[buffer lockFocus];
[self drawStuff];
[buffer unlockFocus];

之后,我只是将该图像绘制到屏幕上,显示方式更快。

- (void) drawRect:(NSRect) dirtyRect {
    [buffer drawInRect:self.bounds];
}

答案 1 :(得分:2)

它可能'如果您的drawRect性能非常强,请帮助设置[scrollView.contentView setCopiesOnScroll:YES];

答案 2 :(得分:-1)

将wantlayer设置为yes。在ios上,默认情况下它是打开的。