我有两个视图,我想使用核心动画在两个视图之间切换,为每个视图的图层设置动画。我想要的动画就像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 :(得分: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π,使其完成旋转并面向您。
答案 1 :(得分:5)
你可以使用
[UIView transitionFromView:aView
toView:bView
duration:0.3
options:UIViewAnimationOptionTransitionFlipFromLeft
completion:^(BOOL finished) {
}
];
我发现你希望在同一个超级视图中同时拥有两个视图,否则事情就会变得有些混乱。