我正在编写一个自定义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的时候:
这是我使用show
segue:
请注意,条形图显示在后者上,而不显示在前者上。
我想知道的是IB如何知道它是推动segue。这是旗帜吗?是因为它使用的特定课程吗?我如何使我的自定义segue也成为推送segue?
编辑:我喜欢prepareForSegue:sender:
中的segue类型,它的类型似乎是UIStoryboardPushSegue
,它不是公开的或有记录的类。我怎么能解决呢?我已尝试在源视图中设置目标视图frame
和bounds
。