了解 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
应该可以解决问题。
我正在尝试创建一个视图,该视图由多个从包含视图的中心视角查看的 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
应该可以解决问题。