了解 3D Core Animation 中的透视变换

Understanding perspective transform in 3D Core Animation

我正在尝试创建一个视图,该视图由多个从包含视图的中心视角查看的 3D 立方体组成。

当我将立方体视图设置为容器视图的直接子视图,然后设置透视如下;

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

3d 透视变换按预期工作。但是,如果我首先将多维数据集视图添加到 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)

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

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