弹出几个视图控制器,但显示所有这些控制器

时间:2012-07-17 15:31:31

标签: ios uinavigationcontroller

我已将UINavigationController和几个UIViewControllers推入其中。我想要实现的是让我们说两个视图控制器。但是我希望堆栈中的前一个控制器在到达所需的控制器之前显示动画(通过它)。这是popToViewController:对我不起作用的主要原因。

我试图通过为所有先前的popViewControllerAnimated:设置一个标志来调用UIViewControllers,这样如果设置了标志,视图控制器将在其popViewControllerAnimated:中调用viewDidAppear: 。这给了我几乎我想要的东西,但是我不喜欢动画不流畅。每个控制器的动画都会变慢,而我希望它们以相同的速度传递。

我正在考虑的另一种方法是避免使用这些控制器并将所有内容放在一个滚动视图中,这样我就可以完全控制如何进行视图事务。

我仍然想知道我能用导航控制器做些什么吗? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

我怀疑你会实现平滑的动画(也许你实现了不同的功能,而不是viewDidAppear: - 然后你可以实现它 - 例如 - 你有3 viewControllers堆叠 - 你弹出第三,同时启动第二个pop,延迟时间与pop动画一样长(0.25?dunno,测试它)。(你通过[self.navigationController viewControllers]从第三个访问第二个)也许是有效的。) / p>

我真的不喜欢滚动视图中所有viewControllers(视图)的想法。 - 它可能消耗太多内存。能。

其他选项是 - 存储每个viewController的屏幕截图。如果只需要平滑的弹出动画,则可以从每个viewController(在后台线程中打开viewController时截取屏幕截图。)并将其添加到全局scrollview imageSet。然后,当弹出时 - 很快显示滚动视图,并通过图像设置动画,而在滚动视图下,viewControllers已经弹出到必要的viewController

(如果某些viewController内容动态更改 - 它可能并不重要,因为用户不会注意到已快速滑动的已截屏的内容)

希望你有一些新的想法:)

答案 1 :(得分:0)

好的,这里有关于我如何实施它的详细信息

  1. 定义协议Screenshotable,它将定义在将下一个视图控制器推入UIViewController时是否应保存UINavigationViewController的外观

    @protocol可截屏 @property(强大,非原子)UIImage *截图; @end

  2. 使视图控制器实现协议,并@synthesize screenshot实施Screenshotable协议。

  3. 现在为UINavigationViewController定义委托并实施以下回调,如下所示:

    • (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { //获取当前视图(这是刚刚推送的视图),但我们想要隐藏前一个视图控制器 int index = [[navigationController viewControllers] count] - 1;

      //检查这是否是第一个视图控制器,还没有截屏 if(index< = 0)return;

      //获取上一个 UIViewController * controller = [[navigationController viewControllers] objectAtIndex: - index];

      //如果屏幕截图可以截屏 if([controller conformsToProtocol:@protocol(Screenshotable)]) {     id screenshotable =(id)controller;

      if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
      {
          UIGraphicsBeginImageContextWithOptions(self.window.bounds.size, NO, [UIScreen mainScreen].scale);
      }
      else
      {
          UIGraphicsBeginImageContext(self.window.bounds.size);
      }
      
      [self.window.layer renderInContext:UIGraphicsGetCurrentContext()];
      screenshotable.screenshot = UIGraphicsGetImageFromCurrentImageContext();
      UIGraphicsEndImageContext();
      

      } }

  4. 现在,实现UIViewControllers协议的导航堆栈中的所有Screenshotable将在推送新控制器之前存储其视图图像。无论什么时候你想回去,他们都会从控制器获取UIImages,将它们添加到当前控制器和动画中。当动画结束时只需调用[self.navigationController popToViewController:controller animated:NO];

  5. 就是这样。