1

我正在尝试在 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:NOanimated:YESCATransition 确实可以工作(但与默认的向上滑动动画同时发生)。这发生在 iOS 6 和 iOS 7 中。

4

1 回答 1

1

在 iPhone 上,呈现的视图控制器总是占据顶层。这意味着如果您说presentViewController:...新视图控制器的视图替换了标签栏控制器。如果这不是您想要的 - 也就是说,如果您想在选项卡内执行过渡动画- 那么您将需要使用视图和不带presentViewController:...or 的过渡,如果您想使用视图控制器,然后使用自定义容器控制器(和转换,同样没有presentViewController),就像我在这里做的那样:

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch06p316containerController/ch19p631containerController/ViewController.m

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

于 2014-05-24T20:10:23.660 回答