CALayer 旋转似乎 'lift' 它在表面上方 child

CALayer rotation appears to 'lift' it's child above the surface

这是具有四个嵌套 UIView 的 iPad 模拟器,绘制自定义背景和一个内部 UILabel。我正在旋转顶部 UIView 的 CALayer,通过获取它的层并使用 rotateY CATransform3D 设置 transform,在单独的线程上设置动画(但对 transform 的更改是自然地在主线程上发送):

注意 - 此动画没有正确循环,因此看起来是弹跳。

作为一个整体动画,但奇怪的是,第一个 child 和它的后代似乎漂浮在 UIView 之上已申请!

UIView 本身是另一个 UIView 中的 children,它有红色背景。其他任何地方都没有应用其他转换。

每个 UIView 的位置最初都是使用 setFrame 设置的。

是什么导致了这种奇怪的行为,我如何才能确保 child UIView 与它们的 parent 一起变换,使整个表面呈现出平坦的外观?

问题是 CALayers 默认情况下实际上并不进行 3D 透视。为此,您需要对图层的变换(类型为 CATransform3D)进行微小更改

您想将转换的 .m34 字段更改为较小的负值。尝试将 -1/200 到 -1/500 作为起始范围。如果我没记错的话应该是图像上的1的负数height/width.

将要显示的图层的 .m34 属性 更改为 "come off the page" 并在 3D 中旋转。当你这样做时,图层的 Z 设置确实很重要,它既会使较近的图层变大,也会使较远的图层消失在其他东西后面。

我建议您在 "CATransform3D m34" 上进行 Google 搜索以获取更多信息。网上有很多关于它的信息。

嗯。也许不出所料,我做了一些愚蠢的事情,但由于我以前没有使用过 CALayer 转换,所以我不知道事情是否正常。我在我创建的 UIView 上覆盖了 layoutSubviews,旋转 CALayer 的行为触发了这个调用,然后由于一个错误而推动子组件框架。