0

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

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

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

现在,正如这里所暗示的(即使它是关于 iOS 我假设模型足够相似,以至于该解决方案也可以在 OS X 上运行),如果我覆盖isOpaque返回NO,则背景绘制正确。为什么?NSClipView 有什么不同之处在于它可以YES在仍然绘制背景的同时返回?

还是我实现此滚动视图的方法错误?

谢谢。

4

1 回答 1

1

isOpaque基本上是对系统的一个提示,它说“不要费心在这个视图下面渲染任何东西,因为它无论如何都不可见”。

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

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

因此,根据我从您的问题中可以理解的情况,您只需在进行其余的绘图之前用白色填充您的视图:

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

    // continue drawing the rest of your stuff...
}
于 2015-09-20T04:29:32.867 回答