Ios 为什么设置我的CALayer';s不透明度似乎也会影响子层';什么是不透明度?

Ios 为什么设置我的CALayer';s不透明度似乎也会影响子层';什么是不透明度?,ios,core-animation,core-graphics,Ios,Core Animation,Core Graphics,我没有显式地设置子层的不透明度——只有通过opacity属性设置超层的不透明度。虽然超层的不透明度确实会如预期的那样发生变化,但我的子层的不透明度似乎也会发生变化,从而导致超层中这些子层下面的元素被曝光。为什么会发生这种情况?为什么会让你感到惊讶?你以为会发生什么?如果你不想这样,不要把那些子层放在超层里面。只要把它们放在上面(也许在一个单独的超层中) 编辑:我现在理解你的问题了。您正在运行一个核心动画优化。核心动画试图通过在合成之前对所有子层应用不透明度来节省时间。这样,它可以只合成一次(这

我没有显式地设置子层的不透明度——只有通过
opacity
属性设置超层的不透明度。虽然超层的不透明度确实会如预期的那样发生变化,但我的子层的不透明度似乎也会发生变化,从而导致超层中这些子层下面的元素被曝光。为什么会发生这种情况?

为什么会让你感到惊讶?你以为会发生什么?如果你不想这样,不要把那些子层放在超层里面。只要把它们放在上面(也许在一个单独的超层中)


编辑:我现在理解你的问题了。您正在运行一个核心动画优化。核心动画试图通过在合成之前对所有子层应用不透明度来节省时间。这样,它可以只合成一次(这样就可以忽略容器超层)。在大多数情况下,这可以解决问题并提高性能


你想要它做的是在超层内进行所有合成,然后应用不透明度,然后将结果与其他所有内容重新合成。这叫做光栅化;这基本上意味着“请在将我与任何其他内容合成之前将我转换为位图”。您可以通过在您的超图层上设置
shouldRasterize
来请求此操作。

对不起,可能我不清楚。当我降低给定CALayer的不透明度时,我的预期效果是该层及其子层的渲染与以前完全相同,只是使用较低的alpha。实际发生的情况是,超层的alpha正在减少(这是我想要的),但是/在/超层子层的alpha也在减少(这是我不想要的)。为什么更改超层的不透明度会影响其子层的alpha通道?换句话说,为什么超层的alpha决定了它的子层应该如何在该超层内相互屏蔽?子层不应该完全忘记其父层的alpha通道吗?有趣的是——我很好奇这到底是如何优化性能的。在我看来,设置子层的不透明度会增加合成的复杂性,从而对性能产生相反的影响。不管怎样,你是对的,反正我打算用shouldRasterize。没有意识到仅仅获得正确的alpha混合行为是必要的。这很有趣,但它不适用于CATTransferMlayer。不幸的是,(目前)似乎根本不可能让真正的3D形状在不暴露形状另一面的情况下变得部分透明(奇怪的行为,如OP所述)——除非我也缺少这种情况的解决方案。