理解3D核心动画中的透视变换

时间:2016-06-05 01:22:03

标签: ios 3d core-animation

我正在尝试创建一个视图,其中包含从包含视图的中心透视图查看的多个3D立方体。

当我将多维数据集视图设置为容器视图的直接子视图,然后按如下方式设置透视图时;

var perspective = CATransform3DIdentity
perspective.m34 = -1.0/250
containerView.layer.sublayerTransform = perspective

三维透视变换按预期工作。但是,如果我首先将多维数据集视图添加到innerContainerView,然后将其添加到父容器视图,则视图将丢失。我created a playground来说明我的问题。

let containerView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 667.0, height: 375.0))
containerView.backgroundColor = UIColor.grayColor()
XCPlaygroundPage.currentPage.liveView = containerView

let green = UIColor.greenColor()
let blue = UIColor.blueColor()
let red = UIColor.redColor()
let purple = UIColor.purpleColor()
let yellow = UIColor.yellowColor()
let orange = UIColor.orangeColor()


var perspective = CATransform3DIdentity
perspective.m34 = -1.0/250
containerView.layer.sublayerTransform = perspective

let cubeView1 = CubeView(frontColor: green, backColor: blue, topColor: red, rightColor: purple, bottomColor: yellow, leftColor: orange)
cubeView1.frame = CGRectMake(50, 50, 100, 100)
let innerContainerView = UIView(frame: CGRectMake(0, 100, 200, 200))
innerContainerView.backgroundColor = UIColor.lightGrayColor()
containerView.addSubview(innerContainerView)
innerContainerView.addSubview(cubeView1)


let cubeView2 = CubeView(frontColor: green, backColor: blue, topColor: red, rightColor: purple, bottomColor: yellow, leftColor: orange)
cubeView2.frame = CGRectMake(400, 200, 100, 100)
containerView.addSubview(cubeView2)

Playground image

我正在尝试创建左立方体中右侧立方体中显示的相同透视图。那么为什么当我添加一个中间视图时,我会失去视角?

1 个答案:

答案 0 :(得分:1)

CoreAnimaton渲染模型始终将渲染操作展平为父图层。此规则的一个例外是CATransformLayer,它不会进行任何展平,只是通过变换。创建UIView CATransformLayer作为layerClass并将其用作innerContainerView可以解决问题。