Cocoa:NSVisualEffectView上的组件背景在将层支持的NSView阴影添加到NSWindow的contentView时错误地呈现

时间:2015-02-07 14:53:23

标签: cocoa transparency calayer nsvisualeffectview

enter image description here

我有一个半透明的NSView,我用它作为阴影调暗主窗口,而模态窗口在我的Cocoa应用程序(OS X Yosemite)中显示为工作表。

有关隔离的示例项目,请参阅下面的更新部分。

阴影正确显示,但它覆盖视图层次结构中较低的其他组件,这些组件的背景变得可见并呈半透明呈现(同时它们应保持完全透明)。

在上面的屏幕截图中,您可以看到覆盖进度指示器(小方块)和NSTextField(标签)一半的阴影。纸张覆盖的一半与背景不正确地呈现;另一半正常呈现。

视图层次结构中较低的组件位于NSVisualEffectView上,设置为混合模式Behind Window,材质Light和外观Vibrant Light以及setWantsLayer设置为true。

我感觉我对基于图层的NSVisualEffectViews和NSViews之间的合成交互缺少了一些东西。

我很感激你对可能导致错误渲染的原因的看法,因为我对Cocoa的复杂性还很新。谢谢!

更新

我刚刚做了一个快速隔离的测试用例来演示这个问题。你可以clone it from here

它还演示了一个带有alpha(角落指示符)而不是另一个(星号)的图像发生的问题

Screenshot of the isolated test, showing the composition artefacts

解决方法

由于Daniel Chotesee tweet),解决方法是在所有组件上手动将背景颜色设置为透明。正如丹尼尔提到的那样,“可怕的解决方案”,但至少是解决方案:)

(请务必记住在抓住你的头之前打开Draws Background,看看为什么它仍无效。):)

如果有人有更好的解决方案,我会全力以赴。稍等一下,如果我什么都没听到,就会提出雷达。

0 个答案:

没有答案