【问题标题】:Custom animation for UINavigationController push not rendering navbar correctlyUINavigationController 的自定义动画推送未正确呈现导航栏
【发布时间】:2012-06-23 00:42:18
【问题描述】:

在自定义转场中,我有以下简单的过渡:

- (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];
}

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

【问题讨论】:

    标签: ios uinavigationcontroller segue


    【解决方案1】:

    找出我的问题。考虑到 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];
    }
    

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

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

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

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

    【讨论】:

    • 非常感谢!你的代码被剪断帮助我弄清楚,我如何在推送期间只动画导航栏切换,而不是内容视图切换
    【解决方案2】:

    另一个“狡辩”? 我放了

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

    之前

     [UIView transitionFromView ...  
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多