创建自定义推送segue

时间:2014-12-03 18:16:36

标签: ios objective-c

我正在编写一个自定义segue类(HySegue),它允许视图为过渡设置动画。代码工作得很好,除非在UINavigationController堆栈下。实际上,过渡运行并且动画很好,但顶部UINavigationBar是导致我出现问题的原因。

首次制作动画时,我将目标视图添加为源视图的子视图。就这样:

    UIView * sourceView = sourceViewController.view;
    UIView * destinationView = viewControllerToPresent.view;

    // Force the source view to layout
    [sourceView addSubview:destinationView];
    [sourceView layoutIfNeeded];

转换结束后,我会显示目标视图控制器:

    UIViewController * parentViewController = viewControllerToDismiss.parentViewController;
    UIView * destinationView = destinationViewController.view;

    // Break the view hierarchy that was setup earlier
    [destinationView removeFromSuperview];

    // When presenting in a UINavigationController stack, push the destination view controller
    if ([parentViewController isKindOfClass:[UINavigationController class]]) {

        [(UINavigationController *)parentViewController pushViewController:destinationViewController
                                                                  animated:NO];
    }

    else {

        // Present the destination view controller
        [viewControllerToDismiss presentViewController:destinationViewController
                                              animated:NO
                                            completion:nil];

        [viewControllerToDismiss willMoveToParentViewController:nil];
        [viewControllerToDismiss.view removeFromSuperview];
        [viewControllerToDismiss removeFromParentViewController];
        [viewControllerToDismiss didMoveToParentViewController:nil];
    }

问题在于,在动画期间,目标视图不知道它是否被推入导航堆栈中,因此顶部栏虽然可见,但在视图的界限中不予考虑。也就是说,导航栏是可见的,因为它对于源视图控制器是可见的,但目标视图控制器对它一无所知。当动画结束时,目标视图控制器被推入堆栈,因此它现在知道导航栏,并且我的所有内容都会向前跳到框架上。

顶栏也没有在IB中显示。这是我使用自定义segue的时候:

enter image description here

这是我使用show segue:

的时候

enter image description here

请注意,条形图显示在后者上,而不显示在前者上。

我想知道的是IB如何知道它是推动segue。这是旗帜吗?是因为它使用的特定课程吗?我如何使我的自定义segue也成为推送segue?

编辑:我喜欢prepareForSegue:sender:中的segue类型,它的类型似乎是UIStoryboardPushSegue,它不是公开的或有记录的类。我怎么能解决呢?我已尝试在源视图中设置目标视图framebounds

0 个答案:

没有答案