gpt4 book ai didi

macos - 为什么我的 NSClipView 子类绘制时带有黑色背景,除非我指定 isOpaque NO? NSClipView 本身不这样做

转载 作者:行者123 更新时间:2023-12-03 17:49:18 24 4
gpt4 key购买 nike

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

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

当我在 NSClipView 中重写 drawRect: 时,剪辑 View 的背景变成黑色。该方法可以是空的,它可以遵循super,或者它可以绘制任何东西;结果是一样的。只有省略 drawRect: 才能绘制正确的白色背景颜色。

现在,正如暗示的 here (尽管它是关于 iOS 的,但我认为模型足够相似,该解决方案也适用于 OS X),如果我重写 isOpaque 以返回 NO,则背景会绘制正确。为什么? NSClipView 有什么不同之处,它可以在仍然绘制背景的同时返回 YES 吗?

或者我实现这个 ScrollView 的方法是错误的?

谢谢。

最佳答案

isOpaque 基本上是对系统的一个提示,它表示“不要费心渲染此 View 下方的任何内容,因为它无论如何都不会可见”。

当您重写 drawRect: 且不执行任何操作或仅调用 super (在本例中可能不执行任何操作)时,您的 View 具有透明内容,但它告诉系统不要在其后面绘制内容,结果是黑色。

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

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

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

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

关于macos - 为什么我的 NSClipView 子类绘制时带有黑色背景,除非我指定 isOpaque NO? NSClipView 本身不这样做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32486289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com