2012-08-10 134 views
2

我有两个视图,我想在两个视图之间切换使用核心动画,动画每个视图的图层。我想要的动画就像UIViewAnimationOptionTransitionFlipFromLeft提供的动画,但我无法做到。我可以让图层旋转180度,然后当动画停止时,我转换到下一个视图。如何才能做到这一点?核心动画动画图层水平翻转

我用作代码如下:

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
self.view.layer.zPosition = 100; 
CATransform3D transform = CATransform3DMakeRotation(M_PI, 0, 1, 0); 
[animation setToValue:[NSValue valueWithCATransform3D:transform]]; 
[animation setDuration:.5]; 
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]]; 
[animation setFillMode:kCAFillModeForwards]; 
[animation setRemovedOnCompletion:YES]; 
[animation setDelegate:self]; 

[self.view.layer addAnimation:animation forKey:@"test"]; 

,并在委托我过渡到下一个视图。但是,这并没有什么意义,动画也没有默认动画所提供的那么生动。这怎么能实现呢?

+0

“... FlipFromLeft”有什么问题?当你说“不那么活泼”时,你想要动画是做什么的? – 2012-08-10 18:42:49

+0

我只想使用核心动画来尝试它。动画在默认动画中看起来不像自然,而且当一个视图完全旋转时,我只能添加第二个视图。我觉得默认的动画不仅仅是在3D空间中旋转视图。什么样的动画应该做什么,我在这里想念什么。 – Sandeep 2012-08-10 18:47:44

回答

7

如何使它看起来像一个3D旋转

您的旋转看起来并不像它发生在三维空间中,因为有你的变换没有观点。将变换的m34值更改为像1.0/800.0这样的小值,并且您应该看到它以透视旋转。

CATransform3D transform = CATransform3DMakeRotation(M_PI, 0, 1, 0); 
transform.m34 = 1.0/800.0; 
[animation setToValue:[NSValue valueWithCATransform3D:transform]]; 

3D变换的值(第三列,第四行)控制变换的视角。如果您想了解更多关于它的工作方式,请阅读3D projection on Wikipedia的更多信息。

如何翻转两种观点,好像他们是在卡片的两面

有它看起来像这两种观点都是相同的观点的两个方面,你应该将它们添加旋转背面π度和改变图层的doubleSided属性为两个图层的NO。现在它们在离开你的时候不会看到。当您将旋转应用于正面和背面图层时,它们将更改可见的图层。注意:将前部旋转至π度并将后部旋转至2π,以使其完成旋转并朝向您。

+0

那么这里的问题是视图沿Y轴旋转,所以视图在旋转时似乎在中间被切割。你给出的想法令人印象深刻,但是默认的动画是这样的,旋转的锚点被设置在其他点。我尝试将锚点更改为0,.5。但是,这也改变了视图协调本身。我有点卡住了。 – Sandeep 2012-08-10 21:35:29

+0

图层相对于锚点绘制。如果(0,0.5)为您提供了正确的动画,但位置错误,那么您可以在设置锚点后简单地设置帧。 – 2012-08-11 08:47:49

+0

是的,这是一个很酷的想法,我没有意识到 – Sandeep 2012-08-11 09:07:17

6

你可以使用

[UIView transitionFromView:aView 
        toView:bView 
        duration:0.3 
        options:UIViewAnimationOptionTransitionFlipFromLeft 
       completion:^(BOOL finished) { 
       } 
]; 

我找到你希望有相同的超图别的东西内两种观点变得有点凌乱。

+0

是的,但这种方法不适合我,所以我尝试了其他版本的UIView动画。 [UIView的transitionWithView:self.view持续时间:0.5选项:UIViewAnimationCurveEaseIn动画:^ { [UIView的setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view缓存:YES]; [self.view:new.view]; } completion:nil]; 前者有一些问题,但这只适用于在两个视图之间切换。顺便说一句,我想用核心动画来做。 – Sandeep 2012-08-11 14:42:31