【问题标题】:CATransition not working in UITabBarController (but is working elsewhere)CATransition 在 UITabBarController 中不工作(但在其他地方工作)
【发布时间】:2014-05-25 04:10:23
【问题描述】:

我正在尝试在 UITabBarController 中实现 CATransition。现在,我有一个名为FeedViewController 的课程。 UITabBarController 中的每个选项卡都是此类的一个实例。在每个选项卡视图控制器(FirstViewControllerSecondViewController 等)中,我的代码如下:

- (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 中。

【问题讨论】:

  • 你真正想要完成什么,实际发生了什么?
  • @matt 我想要用户单击按钮时的水平滑动动画。现在,尽管我有 CATransition 代码,但我没有得到任何动画(新视图仍然显示)。
  • 所以这与标签栏控制器无关,对吧?您要问的问题是:用户点击一个按钮,然后您通过从一侧滑动来呈现一个呈现的视图控制器?那是对的吗?您只是想自定义演示过渡动画?
  • @matt 我相信它确实与标签栏控制器有关,因为它在使用两个单层视图控制器时工作正常。在这种情况下,转换代码在FeedViewController 中,FeedViewController 被初始化到每个标签栏视图控制器(FirstViewControllerSecondViewController 等)。这个过程包括将FeedViewController 添加为子视图,然后将其移动到父视图控制器。
  • 在 iPhone 上,演示文稿始终处于顶层。也许您应该使用自定义容器和 no 呈现(在这种情况下,您完全负责过渡)。

标签: iphone uitabbarcontroller catransition


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您为我指明了这个方向。我还没有完全实施的解决方案,但您为我提供了一些指导,可以用来解决我的问题。
猜你喜欢
  • 1970-01-01
  • 2014-05-25
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
相关资源
最近更新 更多