UINavigationController的自定义动画推送无法正确渲染导航栏

时间:2012-06-23 00:42:18

标签: ios uinavigationcontroller segue

在自定义segue中,我有以下简单过渡:

- (void) perform {
    UIViewController *src = (UIViewController *) self.sourceViewController;
    UIViewController *dst = (UIViewController *) self.destinationViewController;
    [UIView transitionWithView:src.navigationController.view duration:1
                       options:UIViewAnimationOptionTransitionFlipFromBottom
                    animations:^{
                        [src.navigationController pushViewController:dst animated:NO];
                    }
                    completion:NULL];
}

内容视图动画效果很好。但是,在执行动画时,顶部的导航栏有一个混乱的布局(按钮全部塞满左上角,没有标题),只有在动画结束时弹出到位。任何人都知道我做错了什么以及如何解决它?谢谢!

2 个答案:

答案 0 :(得分:6)

弄清楚我的问题。考虑到UINavigationController如何工作以及与它管理的UIViewControllers交互,原始代码确实是错误的。 (像我在OP中所做的那样令人讨厌的东西可以作为旧SO帖子的解决方案。)

这里的代码对我有用(有一个小狡辩):

- (void) perform {
    UIViewController *src = (UIViewController *) self.sourceViewController;
    UIViewController *dst = (UIViewController *) self.destinationViewController;
    [UIView transitionFromView:src.view
                        toView:dst.view
                      duration:1
                       options:UIViewAnimationOptionTransitionFlipFromBottom
                    completion:nil];
    [UIView transitionFromView:src.navigationItem.titleView
                        toView:dst.navigationItem.titleView
                      duration:1
                       options:UIViewAnimationOptionTransitionFlipFromBottom
                    completion:nil];
    [src.navigationController pushViewController:dst animated:NO];
}

狡辩:这会将导航栏与内容视图分开设置动画,因此您可以翻转两个部分而不是整个屏幕。我原本试图这样做:

    [UIView transitionFromView:src.navigationController.view
                        toView:dst.navigationController.view

但是失败是因为1)目的地的navigationController属性甚至没有被设置,直到它被推到导航控制器上,2)即使它是我指的是同一个视图!我忘记了

  

导航控制器的视图只是几个容器   其他视图,包括导航栏,可选工具栏和   视图包含您的自定义内容...虽然内容   导航栏和工具栏视图的变化,视图本身就做了   不...导航控制器对象构建的内容   导航栏动态使用导航项(实例)   与视图控制器关联的UINavigationItem类)   导航堆栈。要更改导航栏的内容,   因此,您必须为自定义视图配置导航项   控制器。 (docs)

答案 1 :(得分:0)

另一个“狡辩”? 我把

[src.navigationController pushViewController:dst animated:YES];

 [UIView transitionFromView ...  

以便在目标的viewDidLoad方法中可以访问导航控制器。

相关问题