为什么我的NSClipView子类绘图为黑色背景,除非我指定isOpaque NO? NSClipView本身不这样做

时间:2015-09-09 17:56:35

标签: macos cocoa nsview nsscrollview nsclipview

我想在Cocoa中创建一个任意画布;也就是说,绘图区域可以绘制整个可见区域,并且具有程序员选择的滚动限制,并且对我是否可以在整个可见区域上绘制没有影响。这类似于我在Windows和GTK +上执行此操作的方式,与标准NSScrollView的不同之处在于a)我仅在可见区域绘制(因此(0,0)是可见区域的原点,而不是整个文档)和b)我不限于文档视图框架(因此,如果文档视图小于可见区域,我仍然可以在可见区域中绘制所有内容)。

为此,我正在实现NSClipView的子类来进行绘图,并仅使用NSScrollView的文档视图来设置滚动范围。

当我在NSClipView中覆盖drawRect:时,剪辑视图的背景变为黑色。该方法可以为空,可以推迟到super,也可以绘制任何东西;结果是一样的。只有省略drawRect:才能得到正确的白色背景颜色。

现在,正如暗示here(即使它是关于iOS我假设模型足够相似,解决方案也适用于OS X),如果我重写isOpaque以返回{{1 ,背景绘制正确。为什么?有什么不同的NSClipView,它可以在仍然绘制背景时返回NO而逃脱?

或者我实现此滚动视图的方法是错误的吗?

感谢。

1 个答案:

答案 0 :(得分:1)

isOpaque基本上是对系统的暗示,该系统说“不要在这个视图下面渲染任何东西,因为它无论如何都不会被看到"”。

当你覆盖drawRect:并且什么都不做或者只是调用super(在这种情况下可能什么都不做)时,你的视图具有透明的内容,但它告诉系统不要在它后面绘制东西,结果是黑色。

如果您希望视图后面的内容可见,则必须覆盖isOpaque并返回NO。如果你不想让你的视图后面的东西可见,你必须通过在所有It的表面上绘制来确保它实际上是不透明的(即使你只是用背景颜色填充它,例如白色)。

所以,从我的问题中我可以理解,你只需要在做完其余的绘图之前用白色填充你的视图:

- (void)drawRect:(NSRect)dirtyRect {
    [[NSColor whiteColor] setFill];
    NSRectFill(dirtyRect);

    // continue drawing the rest of your stuff...
}