2

これは、ナビゲーションコントローラーによって管理されているビューコントローラーでプレゼンテーションを行っている場合にのみ発生します。

複製手順は次のとおりです。

1-を使用してViewControllerを提示します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-上部に表示されたViewController(フルスクリーンのもの)を閉じます

[self dismissViewControllerAnimated:YES completion:nil];

ここで問題となるのは、2番目のビューコントローラ(UIModalPresentationCurrentContextを使用して表示)が消えることです。また、UIModalPresentationCurrentContextを使用して別のビューコントローラを表示することはできません。これは、システムがまだそこにあると見なしているためです。

4

1 に答える 1

3

この問題はフレームワークのバグだと思います。前述のように、これは、ナビゲーションコントローラーによって管理されるビューコントローラーでのプレゼンテーションの場合にのみ発生します。包含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];
        }
    }];
}

それだけです...修正は汚いですが、視覚的なちらつきなしでトリックを行います。

于 2012-12-05T14:07:13.797 に答える