5

在自定义 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];
}

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

4

2 回答 2

6

想通了我的问题。考虑到 UINavigationController 的工作方式以及与它管理的 UIViewController 的交互方式,原始代码确实不正确。(像我在 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];
}

Quibble:这将使导航栏与内容视图分开设置动画,因此您可以翻转两块而不是整个屏幕。我最初试图这样做:

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

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

导航控制器的视图只是其他几个视图的容器,包括导航栏、可选工具栏和包含自定义内容的视图……尽管导航栏和工具栏视图的内容会发生变化,但视图本身会发生变化不是...导航控制器对象使用与导航堆栈上的视图控制器关联的导航项(UINavigationItem 类的实例)动态构建导航栏的内容。因此,要更改导航栏的内容,您必须为自定义视图控制器配置导航项。(文档)

于 2012-06-25T19:55:22.207 回答
0

另一个“狡辩”?我放

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

 [UIView transitionFromView ...  

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

于 2012-08-22T22:36:56.400 回答