web-dev-qa-db-fra.com

Créer un popover à partir d'un UIButton dans Swift

Je souhaite créer un petit popover sur 50x50px à partir d'une UIButton. J'ai vu des méthodes en utilisant adaptive segue's mais j'ai mes classes de taille tourner donc signifiant que je ne peux pas utiliser cette fonctionnalité!

Sinon, comment puis-je créer ce popover? Puis-je le créer avec du code dans mon bouton IBACtion? Ou est-il encore possible de faire cela avec des storyboards?

12
user4671001

Vous pouvez effectuer l’une des deux options suivantes:

  • Créez une action pour la UIButton dans votre UIViewController et dans celle-ci présentez la ViewController que vous voulez comme une fenêtre popover et votre UIViewController doit implémenter le protocole UIPopoverPresentationControllerDelegate, regardez dans le code suivant:

    @IBAction func showPopover(sender: AnyObject) {
    
        var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("StoryboardIdentifier") as! UIViewController
    
        popoverContent.modalPresentationStyle = .Popover
        var popover = popoverContent.popoverPresentationController
    
        if let popover = popoverContent.popoverPresentationController {
    
           let viewForSource = sender as! UIView
           popover.sourceView = viewForSource
    
           // the position of the popover where it's showed
           popover.sourceRect = viewForSource.bounds
    
           // the size you want to display
           popoverContent.preferredContentSize = CGSizeMake(200,500)
           popover.delegate = self
        }            
    
        self.presentViewController(popoverContent, animated: true, completion: nil)
    }
    
    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
       return .None
    }
    

    Selon le livre de @mattProgrammation iOS 8:

    Un contrôleur de présentation popover, dans iOS 8, est un contrôleur de présentation (UIPresentationController), et les contrôleurs de présentation sont adaptatifs. Cela signifie que, par défaut, dans un environnement compact horizontalement (par exemple sur un iPhone), le style de présentation modal .Popover sera traité comme étant .FullScreen. Ce qui apparaît en popover sur l'iPad apparaîtra sous la forme d'une vue présentée en plein écran sur l'iPhone, remplaçant complètement l'interface.

    Pour éviter ce problème dans l'iPhone, vous devez implémenter la méthode de délégué adaptivePresentationStyleForPresentationController dans votre UIViewController pour afficher correctement le Popover.

  • L’autre façon, à mon avis, est plus facile à faire et utilise Interface Builder. Organisez-vous simplement à partir de la variable UIButton afin de créer une transition vers la variable ViewController souhaitée et sélectionnez ensuite la transition Popover.

J'espère que cela vous aidera.

12
Victor Sigler

Swift 4 Voici un code totalement opérationnel. Donc, ici, vous verrez une fenêtre popup avec une taille de 250x250:

    import UIKit

    class ViewController: UIViewController {

        @IBOutlet weak var button: UIButton!

        override func viewDidLoad() {
            super.viewDidLoad()

// in case if you don't want to make it via IBAction
            button.addTarget(self, action: #selector(tapped), for: .touchUpInside)
        }

        @objc
        private func tapped() {

            guard let popVC = storyboard?.instantiateViewController(withIdentifier: "popVC") else { return }

            popVC.modalPresentationStyle = .popover

            let popOverVC = popVC.popoverPresentationController
            popOverVC?.delegate = self
            popOverVC?.sourceView = self.button
            popOverVC?.sourceRect = CGRect(x: self.button.bounds.midX, y: self.button.bounds.minY, width: 0, height: 0)
            popVC.preferredContentSize = CGSize(width: 250, height: 250)

            self.present(popVC, animated: true)
        }
    }


// This is we need to make it looks as a popup window on iPhone
    extension ViewController: UIPopoverPresentationControllerDelegate {

        func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
            return .none
        }
    }

Notez que vous devez fournir l'identifiant popVC à l'un des viewController que vous souhaitez présenter sous forme de popup.

J'espère que cela pourra aider!

7
wm.p1us

Ici, vous pouvez présenter un popover sur un clic de bouton.

func addCategory( _ sender : UIButton) {

        var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
        var nav = UINavigationController(rootViewController: popoverContent)
        nav.modalPresentationStyle = UIModalPresentationStyle.Popover
        var popover = nav.popoverPresentationController
        popoverContent.preferredContentSize = CGSizeMake(50,50)
        popover.delegate = self
        popover.sourceView = sender
        popover.sourceRect = sender.bounds

        self.presentViewController(nav, animated: true, completion: nil)

    }
2
Usman Javed

Swift 4 Version

Fait le plus de travail à partir du storyboard

J'ai ajouté un ViewController, je suis allé à son inspecteur d'attributs et j'ai coché la case "Utiliser la taille explicite préférée". Après cela, j'ai changé les valeurs de largeur et de hauteur à 50 chacun.

Une fois que cela a été fait, j'ai cliqué et glissé du bouton vers la variable ViewController que j'ai ajoutée en choisissant "Present as Popover" et en nommant l'identifiant de séquence comme "pop".

Je suis allé à la ViewController où j'avais mon bouton et ajouté le code suivant:

class FirstViewController: UIViewController, UIPopoverPresentationControllerDelegate {
    @IBOutlet weak var popoverButton: UIButton! // the button

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "pop" {
            let popoverViewController = segue.destination
            popoverViewController.modalPresentationStyle = .popover
            popoverViewController.presentationController?.delegate = self
            popoverViewController.popoverPresentationController?.sourceView = popoverButton
            popoverViewController.popoverPresentationController?.sourceRect  = CGRect(x: 0, y: 0, width: popoverButton.frame.size.width, height: popoverButton.frame.size.height)
        }
    }
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.none
    }



    override func viewDidLoad() {
        super.viewDidLoad()
    }

}
0
Korpel