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.
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:
Et le résultat:
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.
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.
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:
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)