- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在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/
我是一名优秀的程序员,十分优秀!