0

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

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

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

我仍然想知道导航控制器是否可以做些什么?谢谢你的帮助。

4

2 回答 2

0

我怀疑你会实现平滑的动画(也许如果你实现不同的功能,而不是viewDidAppear:- 那么你可能会实现它 - 例如 - 你viewControllers在堆栈中有 3 个 - 你弹出第三个,同时启动第二个弹出,用延迟与弹出动画一样长(0.25?不知道,测试它)。(你通过第三个访问第二个[self.navigationController viewControllers])也许有效)。

我真的不喜欢滚动视图中所有viewControllers(视图)的想法。- 这可能会占用太多内存。可以。

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

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

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

于 2012-07-17T15:45:30.123 回答
0

好的,这是我如何实现它的详细信息

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

    @protocol Screenshotable @property (strong, nonatomic) UIImage *screenshot; @结尾

  2. 让视图控制器实现协议以及实现协议的@synthesize screenshot任何位置Screenshotable

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

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

      // 检查这是否是第一个视图控制器,如果 (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协议的导航堆栈中都将在新控制器被推送之前存储他们的视图图像。每当您想通过所有这些返回时从控制器中获取 UIImage,将它们添加到当前控制器并进行动画处理。动画结束时只需调用 [self.navigationController popToViewController:controller animated:NO];

就是这样。

于 2012-08-05T18:15:44.683 回答