2016-06-05 19 views
1

Ich versuche eine Ansicht zu erstellen, die aus mehreren 3D-Würfeln besteht, die aus einer mittleren Perspektive der enthaltenden Ansicht betrachtet werden.Verstehen der Perspektive in 3D-Kern-Animation transformieren

Wenn ich eine Würfelansicht als direkte Unteransicht der Containeransicht einstelle und dann die Perspektive wie folgt einstelle:

Die 3D-Perspektive funktioniert wie erwartet. Wenn ich jedoch die Cube-Ansicht zuerst zu einer innercontainerView hinzufüge und diese dann zur übergeordneten Containeransicht hinzufüge, geht die Perspektive verloren. I created a playground, um mein Problem zu veranschaulichen.

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

Ich versuche, die gleiche Perspektive in dem rechten Würfel im linken Würfel gezeigt zu erstellen. Warum also, wenn ich die Zwischenansicht hinzufüge, verliere ich die Perspektive?

Antwort

1

Das Rendering-Modell CoreAnimaton flacht die Rendering-Operationen immer auf die übergeordnete Ebene ein. Die einzige Ausnahme zu dieser Regel ist CATransformLayer, die keine Abflachung durchführt und nur die Transformationen durchlässt. Erstellen Sie eine UIView mit CATransformLayer als layerClass und verwenden Sie als innerContainerView sollte das Problem lösen.