核心动画动画图层水平翻转

时间:2012-08-10 18:37:32

标签: objective-c ios core-animation

我有两个视图,我想使用核心动画在两个视图之间切换,为每个视图的图层设置动画。我想要的动画就像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"];

并在委托中转换到下一个视图。但是,这没有多大意义,动画不像默认动画那样生动。怎么能实现呢?

2 个答案:

答案 0 :(得分:7)

如何使其看起来像3D旋转

您的旋转看起来不像在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π,使其完成旋转并面向您。

答案 1 :(得分:5)

你可以使用

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

我发现你希望在同一个超级视图中同时拥有两个视图,否则事情就会变得有些混乱。