使用CATransform3D创建翻转动画

时间:2011-04-09 17:06:39

标签: iphone ios4 core-animation avcapturesession catransform3d

我正在尝试重新创建UIViewAnimationTransitionFlipFromRight(和左)。我这样做的原因,如下所示,是在图层被遮挡时,在动画中间对AVCaptureVideoPreviewLayer进行更改。 UIViewAnimationTransitionFlipFromRight不会让我停止动画的一半,进行会话更改,然后继续,所以这是我最好的镜头。

虽然这有效,但它与UIViewAnimationTransitionFlipFromRight不同。图层开始旋转,但更多的是幻灯片,向后和对角线(非常难以描述),然后反转动画的第二部分。我正在寻找图层的右侧翻转到后面,然后继续向左。相反,右侧从右侧开始,向后旋转,然后再次向右旋转。

我做错了什么?

更新: 它第一次正确旋转。之后,上述问题仍然存在。是否与AVCaptureVideoPreviewLayer有关,必须重置?不确定,只是一个猜测。

[UIView animateWithDuration:1.5 delay:0.0 
                                options:UIViewAnimationCurveEaseIn 
                             animations:^{
                                 CATransform3D frontTransform = CATransform3DIdentity;
                                 frontTransform.m34 = 1.0 / -850.0;
                                     frontTransform = CATransform3DMakeRotation(M_PI_2,0.0,1.0,0.0); //flip halfway
                                     frontTransform = CATransform3DScale(frontTransform, 0.835, 0.835, 0.835);
                                 previewLayer.transform = frontTransform;

                             }
                             completion:^(BOOL finished){
                                 if (finished) {

                                     [previewLayer setAutomaticallyAdjustsMirroring:NO];
                                     [previewLayer setMirrored:NO];

                                     [session beginConfiguration];
                                     [[self captureManager] setMirroringMode:AVCamMirroringOff];
                                     [session commitConfiguration];

                                     [UIView animateWithDuration:1.5
                                                           delay:0.0 
                                                         options:UIViewAnimationCurveEaseOut 
                                                      animations:^{
                                                          CATransform3D backTransform = CATransform3DIdentity;
                                                          backTransform.m34 = 0.0f;
                                                              backTransform = CATransform3DMakeRotation(M_PI,0.0,1.0,0.0); //finish the flip
                                                              backTransform = CATransform3DScale(backTransform, 1.0, 1.0, 1.0);
                                                          previewLayer.transform = backTransform;
                                                      }
                                                      completion:^(BOOL finished){
                                                              //nothing upon completion
                                                      }
                                      ];
                                 }
                             }
             ];

2 个答案:

答案 0 :(得分:1)

你没有说“你和UIViewAnimationTransitionFlipFromRight不一样”是什么意思。你看到了视角吗?我发现在调用CATransform3D函数之前我需要先指定.m34字段才能获得透视图。在声明转换之后和调用CATransform3DMakeRotation之前立即设置。

答案 1 :(得分:0)

我不完全确定,但也许您应该在完成动画时将previewLayer.transform重置为CATransform3DIdentity?这可能就是为什么你第二次运行它时会看到奇怪的反向动作。