当您在由导航控制器管理的视图控制器中演示时,这才适用。
复制步骤如下:
1 - 使用 UIModalPresentationCurrentContext
呈现视图控制器
self.definesPresentationContext = YES;
ViewController* viewController = [[ViewController alloc] init];
viewController.modalPresentationStyle = UIModalPresentationCurrentContext;
[presentOnViewController presentViewController:viewController animated:YES completion:nil];
2 - 使用默认的全屏演示样式在顶部显示视图控制器
ViewController* viewController = [[ViewController alloc] init];
[self presentViewController:viewController animated:YES completion:nil];
3 - 关闭顶部显示的视图控制器(全屏视图控制器)
[self dismissViewControllerAnimated:YES completion:nil];
现在的问题是第二个视图控制器(使用UIModalPresentationCurrentContext呈现)消失了。 此外,使用UIModalPresentationCurrentContext呈现另一个视图控制器是不可能的,因为系统认为它仍然存在。
这个问题是框架中的一个错误。 如前所述,它仅在由导航控制器管理的视图控制器中呈现时才发生。 有一个令人讨厌的工作,它使用包含 API。 它创建一个虚拟视图控制器,从中呈现视图。 步骤如下:
1 - 在上下文中呈现父级是导航控制器的视图时,请使用虚拟视图控制器:
- (void)presentInContext
{
UIViewController* presentOnViewController = self;
if ([self.parentViewController isKindOfClass:[UINavigationController class]])
{
// Work around - Create an invisible view controller
presentOnViewController = [[DummyViewController alloc] init];
presentOnViewController.view.frame = self.view.frame;
// Containment API
[self addChildViewController:presentOnViewController];
[self.view addSubview:presentOnViewController.view];
[presentOnViewController didMoveToParentViewController:self];
presentOnViewController.definesPresentationContext = YES;
}
ViewController* viewController = [[ViewController alloc] init];
viewController.modalPresentationStyle = UIModalPresentationCurrentContext;
[presentOnViewController presentViewController:viewController animated:YES completion:nil];
}
2 - 关闭视图控制器时整理
- (void)dismissSelf
{
__weak UIViewController* presentingViewController = self.presentingViewController;
[self dismissViewControllerAnimated:YES completion:^{
// Remove the dummy view controller
if ([presentingViewController isKindOfClass:[DummyViewController class]])
{
[presentingViewController willMoveToParentViewController:nil];
[presentingViewController.view removeFromSuperview];
[presentingViewController removeFromParentViewController];
}
}];
}
就是这样...修复很脏,但没有视觉闪烁。