だから私は私のメインビューコントローラーを持っています。そのビューコントローラーには、ポップオーバーとして提示として設定された種類のストーリーボードセグエを備えたバーボタンアイテムがあります。
これはすべて期待どおりに機能します。ただし、そのポップオーバービューコントローラー内の別のボタンをタップすると、ビューが全画面表示されます。ポップオーバー内に表示したい。既存のポップオーバー境界の上にプッシュ/表示するように。
どうすればこれを達成できますか?
この動作はiPadでのみ必要です。しかし、私はそれがデフォルトでそれを行うと思います。
編集
ストーリーボードでこれをすべて実行したいのですが、それが必要な場合は、Swiftコードでも実行できます。
これはストーリーボードでのみです。
1)UIViewController(青)とctrl +ドラッグ(マウス)をUIBarButtonItemからUIViewControllerに作成し、[ポップオーバーとして表示]を選択します(行ったように)。
2)UIViewController(青)をクリックし、[エディター]-> [埋め込み]-> [ナビゲーションコントローラー]をクリックします(これは、次のコントローラーをポップアップに表示するためのトリックになります)
3)2番目のUIViewController(緑)を作成します
4)最初のUIViewController(青)でUIButtonを作成し、Ctrlキーを押しながらボタンから2番目のUIViewController(緑)にドラッグして、[表示]を選択します。
最後に、ストーリーボードでは次のようになります。
そして結果:
ナビゲーションバーなしでPopOverが必要な場合は、青いコントローラーで使用できます。
self.navigationController?.isNavigationBarHidden = true
緑のビューから青のビューに戻るには、緑のコントローラーで使用できます。
@IBAction func backToBlueController(sender: UIButton) {
self.navigationController?.popViewController(animated: true)
}
追加:
ポップアップを使用したくない場合は、セグエの種類をbarButtonItemからnavigationControllerに変更することもできます。
モーダルに提示
とのようなものへのプレゼンテーション
フォームシート
ストーリーボードで。
ナビゲーションコントローラーは、ポップしてプッシュできるナビゲーションスタックを提供するため、ナビゲーションバーが必要ない場合でも、一目で常にUINavigationControllerを使用してナビゲーションを管理する必要があります。
IBAction
のUIBarButtonItem
を作成し、実際に実行します。
- (IBAction)popupAction:(UIBarButtonItem *)sender {
UIViewController *vc = [[UIViewController alloc] init]; // I don't use segue
vc.view.backgroundColor = [UIColor grayColor];
vc.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController *popvc = vc.popoverPresentationController;
popvc.delegate = self;
popvc.permittedArrowDirections = UIPopoverArrowDirectionAny;
popvc.barButtonItem = sender; // if UIBarButtonItem
// if view
// popvc.sourceView = sender;
// popvc.sourceRect = sender.bounds;
vc.preferredContentSize = CGSizeMake(200, 200);
[self presentViewController:vc animated:YES completion:nil];
}
そしてUIPopoverPresentationControllerDelegate
:
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller traitCollection:(UITraitCollection *)traitCollection{
return UIModalPresentationNone;
}
- (BOOL)popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController{
return YES;
}
迅速:
@IBAction func popupAction(_ sender: UIBarButtonItem) {
let vc = UIViewController.init()
vc.view.backgroundColor = UIColor.gray
vc.modalPresentationStyle = UIModalPresentationStyle.popover
let popvc = vc.popoverPresentationController
popvc?.delegate = self
popvc?.permittedArrowDirections = UIPopoverArrowDirection.any
popvc?.barButtonItem = sender
vc.preferredContentSize = CGSize.init(width: 200, height: 200)
self.present(vc, animated: true, completion: nil)
}
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.none
}
func popoverPresentationControllerShouldDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) -> Bool {
return true
}
これはiPadとiPhoneの両方で機能します。
結果:
ポップオーバーコントローラーで別のviewControllerをポップオーバーします。
試してみましたか-EzPopup( https://github.com/huynguyencong/EzPopup )、a Swift pod。ほんの数行のコード:
// init YourViewController
let contentVC = ...
// Init popup view controller with content is your content view controller
let popupVC = PopupViewController(contentController: contentVC, popupWidth: 100, popupHeight: 200)
// show it by call present(_ , animated:) method from a current UIViewController
present(popupVC, animated: true)