web-dev-qa-db-ja.com

ポップアップ内のiOSPresent View Controller

だから私は私のメインビューコントローラーを持っています。そのビューコントローラーには、ポップオーバーとして提示として設定された種類のストーリーボードセグエを備えたバーボタンアイテムがあります。

これはすべて期待どおりに機能します。ただし、そのポップオーバービューコントローラー内の別のボタンをタップすると、ビューが全画面表示されます。ポップオーバー内に表示したい。既存のポップオーバー境界の上にプッシュ/表示するように。

どうすればこれを達成できますか?

この動作はiPadでのみ必要です。しかし、私はそれがデフォルトでそれを行うと思います。

編集

ストーリーボードでこれをすべて実行したいのですが、それが必要な場合は、Swiftコードでも実行できます。

5
Charlie Fish

これはストーリーボードでのみです。

1)UIViewController(青)とctrl +ドラッグ(マウス)をUIBarButtonItemからUIViewControllerに作成し、[ポップオーバーとして表示]を選択します(行ったように)。

2)UIViewController(青)をクリックし、[エディター]-> [埋め込み]-> [ナビゲーションコントローラー]をクリックします(これは、次のコントローラーをポップアップに表示するためのトリックになります)

3)2番目のUIViewController(緑)を作成します

4)最初のUIViewController(青)でUIButtonを作成し、Ctrlキーを押しながらボタンから2番目のUIViewController(緑)にドラッグして、[表示]を選択します。

最後に、ストーリーボードでは次のようになります。

enter image description here

そして結果:

enter image description here

enter image description here

ナビゲーションバーなしでPopOverが必要な場合は、青いコントローラーで使用できます。

self.navigationController?.isNavigationBarHidden = true

緑のビューから青のビューに戻るには、緑のコントローラーで使用できます。

@IBAction func backToBlueController(sender: UIButton) {
        self.navigationController?.popViewController(animated: true)
}

追加:

ポップアップを使用したくない場合は、セグエの種類をbarButtonItemからnavigationControllerに変更することもできます。

モーダルに提示

とのようなものへのプレゼンテーション

フォームシート

ストーリーボードで。

enter image description here

ナビゲーションコントローラーは、ポップしてプッシュできるナビゲーションスタックを提供するため、ナビゲーションバーが必要ない場合でも、一目で常にUINavigationControllerを使用してナビゲーションを管理する必要があります。

INavigationControllerリファレンス

5

IBActionUIBarButtonItemを作成し、実際に実行します。

- (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をポップオーバーします。

6
tomfriwel

試してみましたか-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)
0
huync