我想在Cocoa中创建一个任意画布;也就是说,绘图区域可以绘制整个可见区域,并且具有程序员选择的滚动限制,并且对我是否可以在整个可见区域上绘制没有影响。这类似于我在Windows和GTK +上执行此操作的方式,与标准NSScrollView的不同之处在于a)我仅在可见区域绘制(因此(0,0)是可见区域的原点,而不是整个文档)和b)我不限于文档视图框架(因此,如果文档视图小于可见区域,我仍然可以在可见区域中绘制所有内容)。
为此,我正在实现NSClipView的子类来进行绘图,并仅使用NSScrollView的文档视图来设置滚动范围。
当我在NSClipView中覆盖drawRect:
时,剪辑视图的背景变为黑色。该方法可以为空,可以推迟到super
,也可以绘制任何东西;结果是一样的。只有省略drawRect:
才能得到正确的白色背景颜色。
现在,正如暗示here(即使它是关于iOS我假设模型足够相似,解决方案也适用于OS X),如果我重写isOpaque
以返回{{1 ,背景绘制正确。为什么?有什么不同的NSClipView,它可以在仍然绘制背景时返回NO
而逃脱?
或者我实现此滚动视图的方法是错误的吗?
感谢。
答案 0 :(得分:1)
isOpaque
基本上是对系统的暗示,该系统说“不要在这个视图下面渲染任何东西,因为它无论如何都不会被看到"”。
当你覆盖drawRect:
并且什么都不做或者只是调用super(在这种情况下可能什么都不做)时,你的视图具有透明的内容,但它告诉系统不要在它后面绘制东西,结果是黑色。
如果您希望视图后面的内容可见,则必须覆盖isOpaque
并返回NO
。如果你不想让你的视图后面的东西可见,你必须通过在所有It的表面上绘制来确保它实际上是不透明的(即使你只是用背景颜色填充它,例如白色)。
所以,从我的问题中我可以理解,你只需要在做完其余的绘图之前用白色填充你的视图:
- (void)drawRect:(NSRect)dirtyRect {
[[NSColor whiteColor] setFill];
NSRectFill(dirtyRect);
// continue drawing the rest of your stuff...
}