如何消除一堆模态视图控制器与animation,而不会在屏幕上闪烁任何提交的VC之间的顶部和底部?

更新:通过下面的“截图”方法大纲修复。 这工作,但有没有更优雅的方式?

我将如何解决一堆模式视图控制器与animation,而不会在屏幕上闪烁任何提交的VC之间的顶部和底部? 试图用animation做到这一点是行不通的。 请参阅下面的代码和内嵌评论,描述我的问题。 您可以将这段代码复制/粘贴到Xcode中的一个新项目中,以便自己查看!

// // ViewController.m // MultipleModals // #import "ViewController.h" #import "MyViewController.h" #import "MyHelper.h" @interface ViewController () @end @implementation ViewController static BOOL doAgain = YES; // So when red appears again, we don't endlessly cycle (for testing) - (void)viewDidAppear:(BOOL)animated { // Invoke super [super viewDidAppear:animated]; // Prevent loop when we dismiss all the way back to red (for testing) if (doAgain) { // Okay here's where the demo code starts... // PRESENTING a full stack of modals WITHOUT animation WORKS and results in the user // only seeing orange when this red view controller "appears" (red never actually appears, which is great)... MyViewController *purple = [[MyViewController alloc] init]; purple.title = @"purple"; // For use in MyViewController's dealloc method purple.view.backgroundColor = [UIColor purpleColor]; [self presentViewController:purple animated:NO completion:^{ // Purple successfully gets presented and the user never sees purple, great. NSLog(@"Purple?"); MyViewController *green = [[MyViewController alloc] init]; green.view.backgroundColor = [UIColor greenColor]; green.title = @"green"; // For use in MyViewController's dealloc method [purple presentViewController:green animated:NO completion:^{ // Green successfully gets presented and the user never sees green, great. NSLog(@"Green?"); MyViewController *orange = [[MyViewController alloc] init]; orange.view.backgroundColor = [UIColor orangeColor]; orange.title = @"orange"; // For use in MyViewController's dealloc method [green presentViewController:orange animated:NO completion:^{ // Orange successfully gets presented and the user DOES see orange, great. NSLog(@"Orange?"); // FIXED MY ISSUE STARTING HERE // Comment out the following code to toggle between // the "flashing purple issue" and "the desired outcome" (single // animation from top to bottom regardless of how many VCs are // on the stack, ie no flashing). // Get orange screenshot UIImage *orangeScreenShotImage = [MyHelper screenshot]; UIImageView *orangeScreenShotImageView = [[UIImageView alloc] initWithImage:orangeScreenShotImage]; // Give purple an orange screenshot since orange will just "flash away" and then purple will animate // away but we'll disguise purple to appear as if it's orange by layering a screenshot of orange on purple. Boom. [purple.view addSubview:orangeScreenShotImageView]; // FIXED MY ISSUE ENDING HERE // FOR TESTING PURPOSES... dismiss after 5 seconds... dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ doAgain = NO; // Prevent viewDidAppear loop (related to my testing code)... // THIS IS MY BUG HERE. WHEN I WANT TO **ANIMATE** THE DISMISSAL OF ORANGE ALL THE WAY BACK TO RED, HOWEVER, I SEE PURPLE FOR A FLASH BEFORE RED!! WHY? // If I do not animate, things work as expected and I go from orange directly back to red in one flash. Why can't I go from orange back red WITH ANIMATION without seeing a flash of purple? BOOL animateDismissalOfOrangeBackToRed = YES; // YES causes me to see a flash of purple before red, why? [self dismissViewControllerAnimated:animateDismissalOfOrangeBackToRed completion:^{ NSLog(@"Back to red..."); }]; }); }]; }]; }]; } } - (void)viewDidLoad { // Invoke super [super viewDidLoad]; // Set self's background color self.view.backgroundColor = [UIColor redColor]; // Color of self, root VC } @end 

MyViewController.m(使我们有一个自定义dealloc方法进行debugging)

 // // MyViewController.m // MultipleModals // #import "MyViewController.h" @interface MyViewController () @end @implementation MyViewController - (void)dealloc { NSLog(@"Inside dealloc self.title = %@", self.title); } @end 

更新:为deallocdebugging添加了新的MyViewController.m文件。

有趣的是,日志看起来像这样:

 2014-11-20 10:06:28.847 MultipleModals[5470:946774] Purple? 2014-11-20 10:06:28.851 MultipleModals[5470:946774] Green? 2014-11-20 10:06:28.853 MultipleModals[5470:946774] Orange? 2014-11-20 10:07:04.055 MultipleModals[5470:946774] Inside dealloc self.title = orange 2014-11-20 10:07:04.056 MultipleModals[5470:946774] Inside dealloc self.title = green 2014-11-20 10:07:04.565 MultipleModals[5470:946774] Back to red... 2014-11-20 10:07:04.566 MultipleModals[5470:946774] Inside dealloc self.title = purple 

更新:我已经添加了一个示例项目,所以你可以非常容易地观察这个第一个句柄,如果你想: https : //github.com/johnerck/MultipleModals

此外,我已经阅读了多次从其他视图控制器呈现视图控制器 。 他们甚至会说:“例如,如果用户取消当前的操作,则可以通过closures第一个呈现的视图控制器来移除链中的所有对象。closures视图控制器不仅可以解除视图控制器,而且还解除其呈现的任何视图控制器。 “ 我看到这种行为,但animation总共显示3个视图,而不是预期的2个视图。

这不是一个错误。 只有在self.presentedViewController时, dismissViewControllerAnimated更改self.presentedViewController (“purple”)的删除animation,但不是所有嵌套的VC。 当“紫色”接收到关于用animation删除的消息时,它将删除所有的presentedViewController而不animation。 然后你看到没有嵌套控制器的“紫色”的animation。 要检查这个,你可以简单地创build你自己的VC类并检查-dealloc方法。