it-swarm.com.de

iOS Present View Controller im Popup

Ich habe also meinen Main View Controller. Dieser Ansichts-Controller verfügt über ein Bar-Button-Element mit einem Storyboard-Bereich, dessen Art als "Als Popover" festgelegt ist.

Das alles funktioniert wie erwartet. Wenn Sie jedoch auf eine andere Schaltfläche in diesem Popover-Ansichts-Controller tippen, wird die Ansicht als Vollbild angezeigt. Ich möchte, dass es im Popover angezeigt wird. Wie Push/Anzeige über den vorhandenen Popover-Begrenzungen.

Wie kann ich das erreichen?

Ich möchte dieses Verhalten nur auf dem iPad. Aber ich denke, das tut das standardmäßig.

Bearbeiten

Ich würde es vorziehen, dies alles im Storyboard zu tun, aber ich bin auch bereit, es mit Swift-Code zu tun, falls dies erforderlich ist.

5
Charlie Fish

Dies ist nur bei Storyboard möglich.

1) Erstellen Sie einen UIViewController (blau) und ziehen Sie die Strg-Taste (Maus) von Ihrem UIBarButtonItem auf den UIViewController, und wählen Sie "als Popover präsentieren" (wie Sie es getan haben).

2) Klicken Sie auf den UIViewController (blau) und klicken Sie auf Editor-> Embed-> Navigation Controller (dies ist ein Trick, um den nächsten Controller im Popup zu lassen).

3) Erstellen Sie einen zweiten UIViewController (grün)

4) Erstellen Sie einen UIButton im ersten UIViewController (blau) und ziehen Sie ihn mit gedrückter Strg-Taste vom zweiten Button auf den zweiten UIViewController (grün) und wählen Sie "show".

Am Ende sollte es in Storyboard so aussehen:

 enter image description here

Und das Ergebnis:

 enter image description here

 enter image description here

Wenn Sie den PopOver ohne Navigationsleiste haben möchten, können Sie ihn im blauen Controller verwenden:

self.navigationController?.isNavigationBarHidden = true

um von der grünen zur blauen Ansicht zurückzukehren, können Sie sie im grünen Controller verwenden:

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

Zusätzlich:

Wenn Sie das popUp nicht verwenden möchten, können Sie auch die Abschnittsart vom barButtonItem zum navigationController in ändern 

Modal präsentieren

und die Präsentation zu sowas 

Formularblatt

im Storyboard.

 enter image description here

Auf einen Blick sollten Sie immer einen UINavigationController verwenden, um Ihre Navigation zu verwalten, auch wenn Sie die Navigationsleiste nicht benötigen, da der Navigations-Controller Ihnen einen Navigations-Stack zur Verfügung stellt, von dem aus Sie in die Navigationsleiste wechseln können.

UINavigationController-Referenz

5

Erstellen Sie eine IBAction von Ihrer UIBarButtonItem und in Aktion:

- (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];
}

Und das UIPopoverPresentationControllerDelegate:

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller traitCollection:(UITraitCollection *)traitCollection{
    return UIModalPresentationNone;
}

- (BOOL)popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController{
    return YES;
}

Schnell:

@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
}

Dies funktioniert sowohl auf dem iPad als auch auf dem iPhone.

Ergebnis:

Popover einen anderen ViewController in einem Popover-Controller:

5
tomfriwel

Haben Sie es versucht - EzPopup ( https://github.com/huynguyencong/EzPopup ), eine Swift-Schote. Nur ein paar Zeilen Code:

// 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