2012-05-02 32 views
1

我有一个NSView作为NSScrollView的documentView。我也有一个NSImageView作为NSView的子视图。该图像动态更改大小,以便滚动条在各种时间变为活动/非活动状态。一旦图像发生变化,我想滚动到图像上的某个点。从NSView的drawRect:方法中,我调用 [[myScrollView contentView] scrollToPoint:myPoint];在NSImage上的NSScrollView和ScrollToPoint

滚动条更新和图像显示,但是只要图像滚动,就会出现双图像或部分图像被切掉。任何帮助,将不胜感激。谢谢。

+1

为什么在'-drawRect:'内滚动?你不应该做任何事情,除了绘制和绝对不会调用任何'-setNeedsDisplay ...'方法的东西。 –

+0

我在解决此问题的下一次尝试是将图像和documentView框架设置在-drawRect方法之外。我会试试 –

+0

你是对的。只要我将setFrame,setOrigin,scrollToPoint等方法移出-drawRect,一切都很完美。非常感谢! –

回答

3

听起来像您可能想要在Interface Builder中以编程方式关闭NSScrollView的“Copy On Scroll”行为选项。

Scroll View Programming Guide for Mac OS X: How Scrolling Works

NSClipView类提供低级别通过 scrollToPoint:方法滚动支持。此方法将翻译 内容视图的边界矩形的原点,并通过复制 将大部分已呈现的文档视图复制为保持可见,从而优化重新显示,只请 文档视图绘制新近暴露的区域。这通常会提高滚动性能,但可能并不总是合适的。您可以使用NSClipView方法setCopiesOnScroll: 传递NO作为参数来关闭 此行为。如果您确实使滚动副本滚动处于活动状态,则为 务必使用NSView 方法scrollPoint:方法而不是translateOriginToPoint:以编程方式滚动文档视图。

+0

试图在IB中设置它,它有点工作。将试试这个组合并设置-drawRect方法之外的documentView框架。谢谢! –