2011-11-27 2 views
2

CATransform3DMakeRotation에 이상한 문제가 있습니다. 회전 된 뷰는 슈퍼 뷰의 중심에있을 때, 그것은 다음과 같습니다CATransform3DMakeRotation의 이상한 전망

Valid XHTML http://i1183.photobucket.com/albums/x467/Laurin_Koppenwallner/Bildschirmfoto2011-11-27um181544.png

이보고 해야하는 방법이있다. 는 수퍼에서 다른 곳의 경우에는, 말하자면, 왼쪽 하단 모서리에, 그것은 다음과 같습니다가 오른쪽으로 기울어 져

Valid XHTML http://i1183.photobucket.com/albums/x467/Laurin_Koppenwallner/Bildschirmfoto2011-11-27um181627.png

하는 것으로. 오른쪽 아래 모서리에있을 때도 똑같은 일이 일어납니다. 단지 왼쪽으로 기울어 져 있습니다. 항상 모든면에서 기울여야 할 방향으로 기울일 수있는 방법이 있습니까? 다음과 같이 변환을 달성하는 코드는 다음과 같습니다 당신은 슈퍼 뷰의 계층에서 관점을 적용한

CALayer *layer = view.layer; 

    CATransform3D aTransform = CATransform3DIdentity; 
    float zDistance = 1000; 
    aTransform.m34 = 1.0/-zDistance; 

    self.view.layer.sublayerTransform = aTransform; 


    CABasicAnimation *rotateAnim = [CABasicAnimation animationWithKeyPath:@"transform"]; 
    rotateAnim.fromValue= [NSValue valueWithCATransform3D:CATransform3DMakeRotation(0, 0, 0, 0)]; 
    rotateAnim.duration=0.12; 
    rotateAnim.toValue=[NSValue valueWithCATransform3D:CATransform3DMakeRotation(20*M_PI/180, 1, 0, 0)]; 

    rotateAnim.removedOnCompletion = NO; 
    rotateAnim.fillMode = kCAFillModeForwards; 
    [layer addAnimation:rotateAnim forKey:@"rotateAnim"]; 
+0

CATransform3D를 올바르게 구성하지 않았을 가능성이 있습니다. 대부분 번역 및 순환 게재가 서로 영향을 미치지 않는 것을 잊어 버릴 가능성이 높습니다. 변환을 생성하는 데 사용하는 코드를 게시하십시오. –

+0

@RobNapier 코드 포함 – kopproduction

답변

3

, 그것은 당신이 얻고있는거야. 전반적인 관점을 고려하지 않고 개별 하위 계층을 기반으로 한 관점을 원한다면 개별적으로 관점을 적용해야합니다. 예를 들어

CALayer *layer = view.layer; 

CATransform3D aTransform = CATransform3DIdentity; 
CGFloat zDistance = 2000.; 
aTransform.m34 = 1.0/-zDistance; 

CABasicAnimation *rotateAnim = [CABasicAnimation animationWithKeyPath:@"transform"]; 

rotateAnim.fromValue= [NSValue valueWithCATransform3D:aTransform]; 
aTransform = CATransform3DRotate(aTransform, 20*M_PI/180, 1, 0, 0);; 
rotateAnim.duration=0.12; 
rotateAnim.toValue=[NSValue valueWithCATransform3D:aTransform]; 
layer.transform = aTransform; 

[layer addAnimation:rotateAnim forKey:@"rotateAnim"]; 

이러한 예에서, I는 모두 fromValue 및 층 toValue 관점 (m34)을 적용한다. 이렇게하면 레이어 자체 앞에 서있는 관찰자에 대한 상대적인 시점을 얻을 수 있습니다. 원래 코드는 뷰의 중앙 앞에 서있는 관찰자를 가지므로 약간의 왜곡 된 시각을 얻습니다.

여기에 약간의 변경 사항이 있습니다. 나는 일반적으로 관측자를 1000이 아니라 2000으로 설정합니다. 1000에서의 관점은 종종 원하는 것보다 큽니다 (강한 관점에 적극적으로 참여하지 않는 한). 문제에 따라 원근감을 완전히 없애고 싶을 수도 있습니다. 방금 습관에서 벗어나지 마십시오.

더 중요한 것은 끝까지 애니메이션을 적용하는 방법을 변경했습니다. removedOnCompletion=NOkCAFillModeForwards을 사용하면 애니메이션을 모델 (layer.transform=aTransform)에 적용하고 애니메이션을 정상적으로 제거하는 것보다 훨씬 복잡한 작업이됩니다. 특히 removedOnCompletion=NO을 사용하면 layer.transform에 대한 이후 요청은 항상 현재 값이 아닌 이전 값을 반환합니다. 또한이 레이어에 애니메이션을 추가로 적용하면 작업이 복잡해집니다. 이것이 완료되면 애니메이션을 제거하는 것이 기본값 인 이유입니다.