7

레이어의 zPosition은 어떤 레이어가 어떤 레이어를 덮을지만 결정하는 것으로 알려져 있습니다. zPosition이 10인지 1000인지는 위치에 영향을 미치지 않습니다.iOS에서 레이어의 sublayerTransform 설정이 CATranformLayer처럼 작동하도록하는 이유는 무엇입니까?

즉, use CATransformLayer to contain those layers 인 경우가 아니면 해당 레이어의 zPosition이 레이어의 위치에 영향을줍니다.

그러나 iOS 5.1.1에서 실행되는 다음 코드는 zPosition이 레이어 위치를 변경하도록합니다 ... 새로운 단일보기 앱에서이 코드를 추가하고 ViewController.m에 다음 코드를 추가 할 수 있습니다. zPositionlayer2 인 경우 88에서 188으로 변경되면 그에 따라 레이어가 이동하는 것을 확인할 수 있습니다. 따라서 CATransformLayer은 코드에 없습니다. 왜 그렇게 행동할까요? (Apple docs 또는 참고 자료를 인용하십시오.)

self.view.layer.sublayerTransform = transform3D;self.view.layer.transform = transform3D;으로 변경되면 zPosition은 위치에 아무런 영향을 미치지 않습니다. 그러나 according to the Apple docs, transform and sublayerTransform only differ in whether self is transformed or not :

두 레이어 속성이 지정 행렬 변환 : transformsublayerTransform을. transform property으로 지정된 행렬은 anchorPoint에 상대적으로 레이어와 그 하위 레이어에 적용되는 입니다. [...] sublayerTransform 속성으로 지정된 행렬은 레이어 자체가 아닌 레이어 하위 레이어 인 에만 적용됩니다.

따라서 왜 변경하면 self.view.layerCATransformLayer처럼 작동하는 것이 이상합니다. 우리는 레이어 transfrom3D을 할 때

-(void) viewDidAppear:(BOOL)animated { 

    CATransform3D transform3D = CATransform3DIdentity; 

    transform3D.m34 = -1.0/1000; 

    transform3D = CATransform3DRotate(transform3D, M_PI/4, 0, 1, 0); 

    self.view.layer.sublayerTransform = transform3D; 

    CALayer *layer1 = [[CALayer alloc] init]; 
    layer1.zPosition = 33; 
    layer1.frame = CGRectMake(100, 100, 100, 100); 
    layer1.backgroundColor = [[UIColor orangeColor] CGColor]; 

    [self.view.layer addSublayer:layer1]; 

    CALayer *layer2 = [[CALayer alloc] init]; 
    layer2.zPosition = 88; 
    layer2.frame = CGRectMake(100, 120, 100, 100); 
    layer2.backgroundColor = [[UIColor yellowColor] CGColor]; 

    [self.view.layer addSublayer:layer2];  

} 

답변

0

우리가 좌표 레이어로 레이어를 생각할 수있는, 그것은 3D 될 좌표, 그러나 그 계층은 여전히 ​​2D로 표시하지만, 하위 계층 transfrom3D를 설정할 때, 레이어는 모든 계층 것 3D.it로 표시가 회전과 동일합니다

1

transformsublayerTransform 속성의 차이점을 실제로 이해하려면 3D 콘텐츠가있는 TV를 보는 관점에서 생각하는 것이 유용하다고 생각합니다. my modified version of your code in Swift playground을 확인하십시오.

다음은 시작 버전입니다. 콘텐츠가 투영되지 않은 TV가 있습니다. 따라서 콘텐츠 (y 주황색 및 노란색 하위 레이어)는 y 축을 기준으로 회전해도 평평하게 보입니다. 직교 투영에 기대되는 것보다 훨씬. 여전히 TV를 보유하지만, 원근 투영과 아래 콘텐츠를 변환하는 경우

.none option

그러나, 지금 당신은 바로 콘텐츠의 깊이를 참조하십시오. 추가 한 하위 레이어의 zPosition은 진정으로 당신에게 깊이 감을주는 데 중요한 역할을하며, 이는 바로 its definition입니다. 이것은 바로 sublayerTransform의 작동 방식입니다. TV 자체는 변환하지 않고 내용 만 변환합니다.이제

.sublayerTransform option

, 내가 transform 대신 sublayerTranform 사용하는 경우처럼 무엇을 볼 것인가? 그래, 분명히 transformsublayerTransform없이 행동을 따라서

.transform option

: 단지 내용을 변환하지 상상하지만, 화면에 부착 된 내용과 함께 에게 전체 TV 회전, 당신은 예상 된 결과를 볼 수있을 거라고 서브 레이어 중 zPosition을 처리하는 경우와 완전히 다르게, the documentation doesn't explicitly say so이지만. 하위 계층의 zPosition은 부모의 transform에 영향을주지 않지만 부모의 sublayerTransform에 정상적인 3D 효과를 제공합니다.