2012-07-17 74 views
0

我有UINavigationController和几个UIViewControllers推入它。我想实现的是让我们说2个视图控制器回来。不过,我希望堆栈中的前一个控制器在获得所需的(通过它)之前显示动画。这是为什么popToViewController:不适合我的主要原因。弹出几个视图控制器,但显示所有人

另一件事我试着拨打popViewControllerAnimated:具有标志设置为所有以前UIViewControllers因此,如果标志被设置,视图控制器将在其viewDidAppear:调用popViewControllerAnimated:。这给了我几乎所需的东西,但是我不喜欢动画不平滑。每个控制器的动画速度都会变慢,而我希望所有的控制器都以相同的速度传递。

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

不知我是否能用导航控制器做点什么? 谢谢你的帮助。

回答

0

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

我真的不喜欢在滚动视图中关于所有viewControllers(意见)的想法。 - 这可能是太多的内存消耗。可以。

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

(如果有的viewController内容是动态变化的 - 它或许并不重要,因为用户不会注意到,从已采取的截图进行滑动快)

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

+0

好吧,我喜欢拍摄屏幕截图的想法,只要内容在我的应用中以前的视图控制器上是静态的。我已经实现了它,稍后会在这里发布解决方案,以防有人需要它。另一个我会尝试的是改变动画曲线的弹出(如果有可能的话)。 – 2012-07-18 09:08:17

0

好吧,这里对我是如何实现它

  1. 定义协议Screenshotable,这将决定如果在接下来的视图控制器推入的UIViewController外观应保存细节

    @protocol截屏 @property(strong,nonatomic)UIImage * screenshot; @end

  2. 使视图控制器实现协议和@synthesize screenshot无论您实施Screenshotable协议。

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

    • (无效)navigationController:(UINavigationController的*)navigationController willShowViewController:(UIViewController的*)的viewController动画:(BOOL)动画 //获取当前视图(这是刚刚推送的视图),但我们想要截图前一个视图控制器,因为它隐藏了 int index = [[navigationController viewControllers] count] - 1;

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

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

      //制作屏幕快照,如果它是screenshotable 如果([控制器conformsToProtocol:@protocol(Screenshotable)]) { ID screenshotable =(ID)控制器;

      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. 现在,在它实现Screenshotable协议将存储新的控制器被推之前他们的视点图像导航堆栈所有UIViewControllers。无论什么时候你想回去通过所有的控制器获取UIImages,将它们添加到当前的控制器中并生成动画。当动画结束时,只需调用[self.navigationController popToViewController:controller animated:NO];

就是这样。