web-dev-qa-db-fra.com

menu popup iPhone comme popover iPad?

Comment puis-je implémenter ce menu contextuel dans l'application iphone comme un popover dans l'ipad?

alt text


EDIT: C'est le meilleur actuellement: https://github.com/runway20/PopoverViewenter image description here

34
elp

Jetez un coup d'œil à l'implémentation iPhone UIPopoverController: WEPopover

21
olfuerniss

iOS 8 et versions ultérieures

À partir de iOS 8, vous pouvez utiliser UIPopoverPresentationController pour les iPhones en plus des iPad. 

 enter image description here

Installer

  • Ajoutez un UIBarButtonItem à votre contrôleur de vue principal. 
  • Ajoutez un autre contrôleur de vue au storyboard. Modifiez-le à la taille souhaitée pour le popover et ajoutez le contenu souhaité. Pour mon exemple, je viens d'ajouter un UILabel. Si vous voulez un menu complet, ajoutez simplement une vue sous forme de tableau ou une liste de boutons.
  • Ajoutez un élément de bouton depuis le bouton de la barre au contrôleur de vue que vous utiliserez comme fenêtre contextuelle. Plutôt que show, choisissez Present as Popover.

 enter image description here

  • Sélectionnez la séquence dans le storyboard et définissez l'identificateur sur popoverSegue (ou la chaîne que vous avez appelée dans le code).

 enter image description here

  • Dans l'inspecteur Attributs du contrôleur de vue contextuelle, cochez Utiliser la taille explicite préférée et vérifiez qu'il s'agit de la taille souhaitée.

 enter image description here

Code

C'est le code du contrôleur de vue principal qui contient le bouton de barre.

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "popoverSegue" {

            let popoverViewController = segue.destinationViewController
            popoverViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
            popoverViewController.popoverPresentationController!.delegate = self

        }
    }

    // MARK: - UIPopoverPresentationControllerDelegate method

    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {

        // Force popover style
        return UIModalPresentationStyle.None
    }
}

Popover à un point d'ancrage arbitraire

Si vous souhaitez que le popover apparaisse quelque part à côté d'un élément de bouton de barre (sur un UIButton par exemple), vous devez définir les paramètres sourceView et sourceRect. Voir cette réponse pour plus de détails.

 enter image description here

Lectures complémentaires

L'exemple ci-dessus provient principalement du premier lien.

28
Suragch

Sur iPhone, vous utiliseriez généralement une feuille UIActionSheet pour une pile de boutons de ce type. Il glisse du bas vers le haut, plutôt que d'apparaître à côté du bouton, mais c'est le comportement standard sur iPhone.

19
Brian

Il y en a un qui est encore meilleur que WEPopover. Développé par une société appelée 50pixels, il s’appelle FPPopover.

Vous pouvez télécharger FPPopover à l'adresse https://github.com/50pixels/FPPopover

7
BigSauce

Vous devez instancier manuellement un UIView à l'aide d'une image d'arrière-plan personnalisée ou d'un dessin avec transparence, ajouter des boutons UIB (ou un autre type de vue personnalisée) par-dessus, et gérer d'une manière ou d'une autre toutes les touches extérieures à cette vue.

Notez que c'est une interface utilisateur non standard. Une feuille d'actions serait plus compatible HIG.

5
hotpaw2

Vous pouvez vérifier WYPopoverController: https://github.com/sammcewan/WYPopoverController

1
Leszek Szary

Pour obtenir un popover d'un élément de bouton de barre de droite sur un contrôleur de navigation faisant partie d'un contrôleur de table, les éléments suivants ont fonctionné pour moi pour Swift 4 et Xcode 9.

  1. Suivez les étapes de Suragch answer ci-dessus (telle que modifiée par la Communauté.)
  2. N'appliquez pas le Segue comme indiqué dans la réponse ci-dessus. Pour une raison quelconque, la séquence force le popover à passer en mode plein écran malgré le réglage de la taille explicite.
  3. Attribuez un titre à votre contrôleur de vue contextuelle dans l'inspecteur des attributs.
  4. Ajoutez le code suivant dans le contrôleur TableView où la fenêtre contextuelle s'affichera.
  5. Modifier l'identifiant de chaîne (celui-ci fait référence à un fichier Constant.Swift) 
  6. Modifiez "comme! FilterVC" pour utiliser le titre de votre contrôleur de vue popover.

    /// Shows a filter popover view
    @IBAction func filterBtnPressed(_ sender: UIBarButtonItem) {
        let popover = storyboard?.instantiateViewController(withIdentifier: FILTER_VC) as! FilterVC
        popover.modalPresentationStyle = UIModalPresentationStyle.popover
        popover.popoverPresentationController?.backgroundColor = UIColor.green
        popover.popoverPresentationController?.delegate = self
        popover.popoverPresentationController?.backgroundColor = ColorPalette.Blue.Medium
        popover.popoverPresentationController?.sourceView = self.view
        popover.popoverPresentationController?.sourceRect = CGRect(x: self.view!.bounds.width, y: 0, width: 0, height: 0)
        popover.popoverPresentationController?.permittedArrowDirections = .up
        self.present(popover, animated: true)
    } }
    
    
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.none
    }
    
0
D. Rothschild

La capture d'écran ci-dessus n'est pas une feuille UIAction. Cela ressemble à une simple sous-classe UIView avec des boutons UIB personnalisés. Allez-y, créez la sous-classe en fonction de vos besoins, puis ajoutez-la en tant que sous-vue à votre vue chaque fois que vous en avez besoin.

0
tux91