Iphone CATTransition不在UITabBarController中工作(但在其他地方工作)

Iphone CATTransition不在UITabBarController中工作(但在其他地方工作),iphone,uitabbarcontroller,catransition,Iphone,Uitabbarcontroller,Catransition,我正试图在UITabBarController中实现CATTransition。现在,我有一个名为FeedViewController的类。UITabBarController中的每个选项卡都是此类的实例。在每个选项卡视图控制器(FirstViewController,SecondViewController等)中,我都有如下代码: - (void)viewDidLoad { [super viewDidLoad]; FeedViewController *feedViewCon

我正试图在UITabBarController中实现CATTransition。现在,我有一个名为
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
中,我有一个iAction,它提供了一个新的视图控制器。代码如下:

-(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];
}
我以前在我的应用程序的其他部分中使用过完全相同的CATTransition代码,它在那里工作得很好但是,在这种情况下,当显示新视图时没有动画。我认为问题在于添加动画的层。具体来说,我认为我需要用其他东西替换
[self.view.superview layer]
,但我不知道是什么

非常感谢你的帮助

更新:


如果在上述代码中将
animated:NO
更改为
animated:YES
,则CATTransition确实起作用(但与默认的向上滑动动画同时发生)。这在iOS 6和iOS 7中都会发生

在iPhone上,显示视图控制器始终占据顶层。这意味着如果您说
presentViewController:…
新视图控制器的视图将替换选项卡栏控制器。如果这不是您想要的,也就是说,如果您想在选项卡内执行转换动画,那么您需要使用视图和转换,而不使用
presentViewController:…
,或者,如果您想使用视图控制器,则使用自定义容器控制器(和一个转换,同样没有
presentViewController
),正如我在这里所做的:


另一方面,如果您的目标是用不同的视图控制器替换整个选项卡栏控制器,那么以iOS和iOS 7都可用的方式自定义该转换的方法是使用自定义容器控制器作为最终的根视图控制器。现在该转换由您决定。例如,这就是我要做的o在my Albumen应用程序中。这由三个导航控制器按顺序组成;点击一个按钮进入下一个导航控制器。显然,我们不想使用
presentViewController:
,因为它们会相互堆积;我们想用另一个来替换整个导航控制器。结构类似于t我刚才提到的代码;最终控制器的视图占据了整个屏幕,当它被交给一个新的子视图控制器时,它会从以前的子视图控制器的视图转换到新的子视图控制器的视图,也占据了整个屏幕(作为它自己视图的总子视图,你看不到).

你到底想完成什么,到底发生了什么?@matt当用户单击按钮时,我想要一个水平滑动动画。现在,我没有得到动画(新视图仍然显示)尽管我有CATTransition代码。所以这与选项卡栏控制器无关,对吗?你要问的问题是:用户点击一个按钮,然后你通过从一侧滑动来呈现一个呈现视图控制器?对吗?你只是想自定义呈现过渡动画?@matt我相信这是必须的使用选项卡栏控制器,因为它在使用两个单层视图控制器时工作正常。在这种情况下,转换代码位于
FeedViewController
,并且
FeedViewController
被启动到每个选项卡栏视图控制器中(
FirstViewController
SecondViewController
,等等)。此过程包括添加
FeedViewController
作为子视图,然后将其移动到父视图控制器。在iPhone上,演示始终处于顶层。也许您应该使用自定义容器,而不使用演示(在这种情况下,您完全负责转换)。感谢您为我指明了方向。我还没有完全实现的解决方案,但您为我提供了一些可以用来解决问题的指导。