我试图在UITabBarController中实现CATransition。现在,我有一个名为FeedViewController
的班级。 UITabBarController中的每个选项卡都是此类的一个实例。在每个标签视图控制器(FirstViewController
,SecondViewController
等)中,我的代码如下:
- (void)viewDidLoad
{
[super viewDidLoad];
FeedViewController *feedViewController = [[FeedViewController alloc] initWithNibName:@"FeedViewController" bundle:nil];
[self addChildViewController: feedViewController];
feedViewController.view.frame = CGRectMake(0,0,320,self.view.frame.size.height);
[self.view addSubview: feedViewController.view];
[feedViewController didMoveToParentViewController: self];
}
现在在FeedViewController
我有一个IBAction,它提供了一个新的视图控制器。这是代码:
-(IBAction)goHome {
HomeViewController *home = [[HomeViewController alloc] initWithNibName:nil bundle:nil];
CATransition *animation = [CATransition animation];
[animation setDuration:0.3];
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromLeft];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[[self.view.superview layer] addAnimation:animation forKey:@"SwitchToView"];
[self presentViewController:home animated:NO completion:nil];
}
我以前在我的应用程序的其他部分使用了完全相同的CATransition代码,并且在那里工作正常。 但是,在这种情况下,在显示新视图时没有动画。我认为问题是我添加动画的图层。具体来说,我认为我需要用其他内容替换[self.view.superview layer]
,但我不知道是什么。
非常感谢您的帮助。
更新:
如果我在上面的代码中将animated:NO
更改为animated:YES
,则CATransition会起作用(但与默认的上滑动画同时发生)。这在iOS 6和iOS 7中都会发生。
答案 0 :(得分:1)
在iPhone上,呈现的视图控制器始终占据顶级水平。这意味着如果您说presentViewController:...
,新视图控制器的视图将替换标签栏控制器。如果那不是您想要的 - 也就是说,如果您想在选项卡中执行过渡动画 - 那么您将需要使用视图和没有presentViewController:...
的过渡或者,如果你想使用一个视图控制器,那么就像我在这里一样使用自定义容器控制器(和一个没有presentViewController
的过渡):
另一方面,如果您的目标是使用不同的视图控制器替换整个标签栏控制器,那么以iOS和iOS 7上可用的方式自定义转换的方法是使用自定义容器控制器作为您的终极根视图控制器。现在过渡取决于你。例如,这就是我在Albumen应用程序中所做的。它由三个导航控制器依次组成;点击按钮进入下一个导航控制器。显然,我们不想使用presentViewController:
,因为它们都会相互堆积在一起;我们想用另一个替换整个导航控制器。结构类似于我刚才指出的代码;终极控制器的视图占据整个屏幕,当它被传递给一个新的子视图控制器时,它会从之前的子视图控制器视图转换到新的子视图控制器的视图,也占据整个屏幕(作为其整个子视图)自己看,你不明白。)