无动画推送 segue

Posted

技术标签:

【中文标题】无动画推送 segue【英文标题】:Push segue without animation 【发布时间】:2012-01-13 01:25:02 【问题描述】:

我正在编写一个基于故事板的 iPhone 应用程序并致力于状态恢复。正常执行转场时,我想让它们动画,但是当我恢复导航层次结构的几个级别时,我只希望最后一个转场动画。除了设置两组转场——一组使用普通推送转场,另一组使用自定义非动画推送转场——还有什么方法可以实现我想要做的吗?

【问题讨论】:

【参考方案1】:

可以独立于应用程序的 segue 或情节提要直接操作视图控制器堆栈。

您可以使用此技术来恢复视图控制器的深层堆栈,并对顶部视图控制器执行/动画处理。 (您可能需要为此创建一个特定的 push segue。)

例如,要恢复两个视图控制器堆栈,您可以执行以下操作。在此示例中,假设现有视图控制器上的某些操作会导致状态恢复,但您可以从 App Delegate 轻松执行它。

[self performSegueWithIdentifier:@"Page2Express" sender:self];

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([segue.identifier isEqualToString:@"Page2Express"])
    
        // Get any state data you need to from Core Data
        CoreDataType *valuePulledFromCoreData = // ...

        // Set up the page 2 view controller as you normally would
        Page2ViewController *page2ViewController = segue.destinationViewController;
        page2ViewController.instanceVariable = valuePulledFromCoreData;

        // Create a loose, page 1 view controller and set it up as required
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
        Page1ViewController *page1ViewController = [storyboard instantiateViewControllerWithIdentifier:@"Page1ViewController"]; // Ensure you have this identifier set up in your storyboard
        page1ViewController.instanceVariable = valuePulledFromCoreData;

        // Add the page 1 view controller to the top of the navigation stack (to be later obscured in the segue by the page 2 view controller)
        NSMutableArray *viewControllers = [[self navigationController].viewControllers mutableCopy];
        [viewControllers addObject:page1ViewController];
        [self navigationController].viewControllers = viewControllers;
     

相反,如果您更喜欢没有动画,那就更简单了。您可以仅通过从 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions- (void)applicationWillEnterForeground:(UIApplication *)application 操作视图控制器堆栈(并且不使用任何 segue)来恢复状态。

任何一种方式都可以无缝地工作,并与您现有的故事板和转场配合使用。

【讨论】:

只是出于兴趣,您是否有理由操纵 viewControllers 数组而不是使用 pushViewController:animated: pushViewController:animated: 不仅将视图控制器添加到堆栈中 - 它还刷新视图以显示该视图控制器。在这种情况下,我们不想看到page1ViewController,即使是短暂的,所以我们必须自己直接将它添加到堆栈中。

以上是关于无动画推送 segue的主要内容,如果未能解决你的问题,请参考以下文章

在 segue 中停用推送动画

在没有 UINavigationController 的情况下推送 Segue 动画

推送segue动画不起作用

具有清晰背景的 Segue 推送动画在 iOS 7 上闪烁

无堆叠推送视图控制器

从 UINavigationController 中删除动画推送展开?