2016-06-05 3 views
1

포함 된 뷰의 중심 관점에서 본 여러 3D 큐브로 구성된 뷰를 만들려고합니다.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) 

Playground image

나는 왼쪽 큐브의 오른쪽 큐브에 표시된 동일한 관점을 만들려고 해요. 그렇다면 나는 중간 시점을 추가 할 때 왜 관점을 잃을까요?

답변

1

CoreAnimaton 렌더링 모델은 항상 렌더링 작업을 부모 레이어에 평평하게 만듭니다. 이 규칙의 한 가지 예외는 평평하지 않고 변환을 통과시키는 CATransformLayer입니다. UIViewCATransformLayer으로 만들고 layerClass을 작성하고 innerContainerView으로 사용하면 문제가 해결됩니다.