web-dev-qa-db-fra.com

UIPopoverPresentationController affichant popover en plein écran

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
}
36
The Nomad

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
}
37
gabbler

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

16
karthik sarpatwari

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
   }

 }
2
mourodrigo

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 ou UIModalPresentationNone. Renvoyer UIModalPresentationNone 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 et sourceRect sur une région spécifique dans l'une de vos vues.
1
Jesse Gumpo

iOS 12/Swift 4

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
0
Sandu