J'essaie d'utiliser UIPopoverPresentationController
pour afficher une popover
qui ne prend pas tout l'écran. J'ai suivi de nombreux tutoriels sans succès.
Voici mon code. Il installe correctement la ViewController
, mais il occupe tout l’écran au lieu d’un écran plus petit comme je l’ai défini dans preferredContentSize
.
func showPopover() {
let vc = self.storyboard?.instantiateViewControllerWithIdentifier("PopupTimePickerViewController") as PopupTimePickerViewController
vc.modalPresentationStyle = .Popover
vc.preferredContentSize = CGSizeMake(200, 100)
if let presentationController = vc.popoverPresentationController {
presentationController.delegate = self
presentationController.permittedArrowDirections = .Up
presentationController.sourceView = self.view
presentationController.sourceRect = CGRectMake(0, 0, 50, 50)
self.presentViewController(vc, animated: true, completion: nil)
}
}
Mise à jour du 27/09/16 avec la bonne réponse
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
return .none
}
Dans l'iPhone, vous devez ajouter ce qui suit afin de présenter une popover.
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController!) -> UIModalPresentationStyle {
// Return no adaptive presentation style, use default presentation behaviour
return .None
}
Pour Swift3/IOS10, il semble que nous devions faire quelque chose comme
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle
{
return .none
}
En ajoutant cette réponse, au cas où quelqu'un rencontrerait ce problème comme je l'ai fait lors de la migration vers Swift3/IOS10
Pour Swift3 +/IOS10 +, lorsque vous utilisez un iPhone:
Vous devez ajouter UIPopoverPresentationControllerDelegate le délégué à:
class YourClass: UIViewController, UIPopoverPresentationControllerDelegate { ...
Puis implémentez dans la même classe parente (qui affichera la popover) la méthode ci-dessous.
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle
{
return .none
}
Et puis définissez la configuration popover ci-dessous:
myPopover.modalPresentationStyle = .popover
myPopover.popoverPresentationController?.sourceRect = VIEWTOPOINTTHEARROW.frame
myPopover.popoverPresentationController?.sourceView = self.view
myPopover.popoverPresentationController?.delegate = self
Vous pouvez aussi définir une configuration pour la classe popover
class MyPopover: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//popover size
self.preferredContentSize = CGSize(width: 320, height: 200)
//sets the arrow of the popover to same color of background
self.popoverPresentationController?.backgroundColor = self.view.backgroundColor
}
}
La réponse acceptée est correcte. Pour plus de détails, voir Adaptation des contrôleurs de la vue présentée à un nouveau style dans les documents Apple:
Utilisez la méthode
adaptivePresentationStyleForPresentationController:
du délégué pour spécifier un style de présentation différent de celui par défaut. Lors de la transition vers un environnement compact, les seuls styles pris en charge sont les deux styles plein écran ouUIModalPresentationNone
. RenvoyerUIModalPresentationNone
indique au contrôleur de présentation d'ignorer l'environnement compact et de continuer à utiliser le style de présentation précédent. Dans le cas d'un popover, ignorer la modification vous donne le même comportement de popover de type iPad sur tous les appareils.
Assurez-vous que les configurations requises à partir de Présentation d'un contrôleur de vue dans un popover sont remplies:
Après avoir défini le style de présentation modale [du contrôleur de vue présenté] sur
UIModalPresentationPopover
, configurez les attributs suivants liés au popover:
- Définissez la propriété
preferredContentSize
de votre contrôleur de vue sur la taille souhaitée.- Définissez le point d'ancrage popover à l'aide de l'objet
UIPopoverPresentationController
associé, accessible à partir du fichier la propriétépopoverPresentationController
du contrôleur de vue.- Définissez un seul des éléments suivants:
- Définissez la propriété
barButtonItem
sur un élément de bouton de barre.- Définissez les propriétés
sourceView
etsourceRect
sur une région spécifique dans l'une de vos vues.
Il est également possible d'afficher le popover sur IPhone en plein écran et sur IPad en popover.
Il suffit de renvoyer .popover
pour adaptivePresentationStyle()
:
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return .popover
}
et définissez la configuration popover comme @mourodrigo l'a fait:
dialog.modalPresentationStyle = .popover
dialog.popoverPresentationController?.delegate = self
dialog.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
dialog.popoverPresentationController?.sourceView = view
dialog.popoverPresentationController?.sourceRect = view.frame