CALayer旋转似乎将它的孩子“抬起”在水面之上

时间:2015-10-29 19:47:08

标签: ios uiview core-animation

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

Oh deary me

注意 - 此动画无法正确循环,因此它似乎会反弹。

图层作为一个整体动画,但奇怪的是,第一个孩子及其后代似乎浮动在UIView上方并应用了变换!

UIView本身是另一个UIView中的孩子,其背景为红色。其他任何地方都没有其他变换。

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

导致这种奇怪行为的原因是什么?如何确保孩子UIView与父母一起变换,使整个表面呈现平坦的外观?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

您想要将变换的.m34字段更改为较小的负值。尝试-1/200到-1/500作为起始范围。如果我没记错的话,它应该是图像高度/宽度的负1。

更改要显示为“离开页面”的图层的.m34属性并以3D方式旋转。当你这样做时,图层的Z设置确实很重要,并且会使更近的层更大,并且使更远的层消失在其他东西之后。

我建议您在“CATransform3D m34”上进行Google搜索,以获取更多信息。关于它的网上有大量的信息。