web-dev-qa-db-fra.com

contrôleur de vue présent iOS dans Popup

J'ai donc mon contrôleur de vue principale. Ce contrôleur de vue a un élément de bouton de barre avec une transition de story-board avec le type défini en tant que Present As Popover.

Tout cela fonctionne comme prévu. Mais lorsque vous appuyez sur un autre bouton de ce contrôleur de vue popover, il affiche la vue en plein écran. Je veux qu'il apparaisse dans la popover. Comme pousser/afficher au-dessus des limites de popover existantes.

Comment puis-je atteindre cet objectif?

Je veux seulement ce comportement sur iPad. Mais je pense que c'est le cas par défaut.

Modifier

Je préférerais tout faire dans le scénarimage, mais je suis prêt à le faire avec le code Swift également si cela est nécessaire.

5
Charlie Fish

Ceci est seulement avec Storyboard.

1) Créez un UIViewController (bleu) et ctrl + glissez (souris) de votre UIBarButtonItem vers UIViewController et sélectionnez "present as Popover" (comme vous l'avez fait).

2) Cliquez sur UIViewController (bleu) et cliquez sur Editeur-> incorporer dans> Contrôleur de navigation (ce sera une astuce pour laisser le prochain contrôleur rester dans la fenêtre contextuelle).

3) Créez un deuxième UIViewController (vert)

4) Créez un UIButton dans le premier UIViewController (bleu) et ctrl + glisser du bouton vers le deuxième UIViewController (vert) et sélectionnez "Afficher".

À la fin, cela devrait ressembler à ceci dans Storyboard:

 enter image description here

Et le résultat:

 enter image description here

 enter image description here

Si vous voulez PopOver sans la barre de navigation, vous pouvez utiliser le contrôleur bleu:

self.navigationController?.isNavigationBarHidden = true

et pour revenir de la vue verte à la vue bleue, vous pouvez utiliser le contrôleur vert:

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

Additionnel:

Si vous ne voulez pas utiliser le popUp, vous pouvez également changer le type de séquence de barButtonItem à navigationController en 

Présenter Modalement

et la présentation à quelque chose comme 

Feuille de formulaire

dans Storyboard.

 enter image description here

En un coup d'œil, vous devez toujours utiliser un contrôleur UINavigationController pour gérer votre navigation, même si vous n'avez pas besoin de la barre de navigation, car le contrôleur de navigation vous fournit une pile de navigation à partir de laquelle vous pouvez ouvrir et pousser.

Référence UINavigationController

5
Retterdesdialogs

Créez une IBAction de votre UIBarButtonItem et, en action:

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

Et la UIPopoverPresentationControllerDelegate:

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

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

Rapide:

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

Cela fonctionne à la fois sur iPad et iPhone.

Résultat:

Survolez un autre viewController dans un contrôleur de popover:

5
tomfriwel

L'avez-vous essayé - EzPopup ( https://github.com/huynguyencong/EzPopup ), un pod Swift. Juste quelques lignes de 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