更新:
私は再びこの問題に直面し、別の方法を見つけました。プレゼンテーションコントローラーがナビゲーションコントローラーに埋め込まれていない場合、プレゼンテーションコントローラーがフルスクリーンでないと非表示になり、黒になります。メソッドsetModalPresentationStyle:UIModalPresentationCurrentContextは、ナビゲーションコントローラーにのみ適用できます。提示コントローラーをUINavigationControllerに埋め込み、UIModalPresentationCurrentContextをそれに設定して、新しいコントローラーを提示します-ダイアログコントローラーを取得します。
私は検索コントローラーを提示しています、それはスタック詳細コントローラーでプッシュするtableViewを持っています。
詳細なコントローラーは、ビューコントローラーにメッセージを表示できます。これは、小さなUIViewと半透明の背景で構成されます。
問題:最後に表示されたビューコントローラーが表示されると、その下にあるすべてのビューコントローラーが非表示になり、表示された検索コントローラーが表示されます。
ここで私がやっていること:
SearchViewController *viewController = [[SearchViewController alloc] initWithNibName:@"SearchViewController" bundle:nil];
viewController.data = dataArray;
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
[self.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];
[self.navigationController presentViewController:navigationController animated:YES completion:nil];
テーブルが詳細ビューをプッシュするより:
DetailViewController *viewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
[viewController setHidesBottomBarWhenPushed:YES];
viewController.dataItem = [data objectAtIndex:(NSUInteger) [indexPath row]];
[self.navigationController pushViewController:viewController animated:YES];
メッセージボックスを表示する詳細ビュー:
MessageController *controller = [[MessageController alloc] initWithNibName:@"MessageController" bundle:nil];
controller.message = message;
[self presentViewController:controller animated:YES completion:nil];
却下すると、その下のすべてのコントローラーが表示されます。
更新:
私が欲しかったのは、uitableviewを持つビューコントローラーをモーダルに表示することだけです。この表から、メッセージボックスを表示できる詳細ビューを表示します。メッセージボックスは別のビューコントローラーである必要があります。そして、メッセージボックスが表示されると、先行する2つのコントローラーがすべて消えます。それが問題です。
これを達成するための簡単な方法は、モーダルで表示したいVCを作成し、次々に表示することです。残念ながら、これはうまくいきません。あなたが得るものは、最初のVC提示されただけです、他のすべてはどこにも行きません。UIKitはここであなたと協力しません。
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.view.layer renderInContext:context];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
状況によっては、モーダルで表示される各ビューコントローラに次のビューコントローラを表示させることができます。
let window = UIApplication.sharedApplication().keyWindow!
if let modalVC = window.rootViewController?.presentedViewController {
modalVC.presentViewController(vc, animated: true, completion: nil)
} else {
window.rootViewController!.presentViewController(vc, animated: true, completion: nil)
}
表示されたビューコントローラの上にあるすべてのビューコントローラを閉じます。
Appleのドキュメントは次のとおりです。
複数のビューコントローラーを連続して提示し、提示されたビューコントローラーのスタックを構築する場合、スタックの下位にあるビューコントローラーでこのメソッドを呼び出すと、その直接の子ビューコントローラーと、スタック上のその子より上のすべてのビューコントローラーが閉じます。これが発生すると、最上位のビューのみがアニメーション形式で閉じられます。中間のView Controllerはスタックから削除されるだけです。最上位のビューは、モーダル遷移スタイルを使用して閉じられます。これは、スタックの下にある他のビューコントローラーで使用されるスタイルとは異なる場合があります。
2つのモーダルビューコントローラーを閉じます。
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:NULL];
この答えは少し型破りに思えるかもしれませんが、うまくいきます。 「複数のモーダルを開く」ことができますが、一度に1つしか表示されません。重要なのは、モーダルを1つだけにすることですが、Tab Bar Controllerを使用してView Controllers。
tabBarController?.selectedIndex = 1
_を使用してモーダルを切り替えるdismissViewControllerAnimated(true, completion: nil)
でモーダルを閉じます次のようになります。
正しいmodalPresentationStyle
をboth the navigationController
AND viewController
自体に設定します。
self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
vcToPresent.modalPresentationStyle = UIModalPresentationFormSheet;
vcToPresent.preferredContentSize = CGSizeMake(650, 450);
[self presentViewController:vcToPresent animated:YES completion:^{
self.navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
}];`
私は解決策を見つけました:あなた自身のカスタムアニメーションを提供してください:
let transition: CATransition = CATransition()
transition.duration = 0.5
transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
transition.type = kCATransitionReveal
transition.subtype = kCATransitionFromBottom
self.view.window!.layer.add(transition, forKey: nil)
self.presentingViewController?.presentingViewController?.dismiss(animated: false, completion: nil)