web-dev-qa-db-fra.com

Comment changer la taille d'un popover

J'ai du mal à changer la taille de ma présentation popover. Voici ce que j'ai jusqu'à présent

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) // func for popover
{
    if segue.identifier == "popoverView"
    {
        let vc = segue.destinationViewController

        let controller = vc.popoverPresentationController

        if controller != nil
        {
            controller?.delegate = self
            controller?.sourceView = self.view
            controller?.sourceRect = CGRect(x:CGRectGetMidX(self.view.bounds), y: CGRectGetMidY(self.view.bounds),width: 315,height: 230)
            controller?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
        }
    }
}

Jusqu'à présent, tout cela ne fait que centrer le popover et supprimer la flèche, ce qui est bien. mais il ne redimensionne pas le conteneur. toute aide serait grandement appréciée. Je vous remercie.

lorsque j'utilise PreferredContentSize, j'obtiens l'erreur "Impossible d'attribuer à la propriété: 'PreferredContentSize' est immuable"

24
icestorm0806

Définissez la taille de contenu préférée sur le contrôleur de vue présenté et non sur popoverPresentationController

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) // func for popover
    {
        if segue.identifier == "popoverView"
        {
            let vc = segue.destinationViewController

            vc.preferredContentSize = CGSize(width: 200, height: 300)

            let controller = vc.popoverPresentationController

            controller?.delegate = self
            //you could set the following in your storyboard
            controller?.sourceView = self.view
            controller?.sourceRect = CGRect(x:CGRectGetMidX(self.view.bounds), y: CGRectGetMidY(self.view.bounds),width: 315,height: 230)
            controller?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)

        }
    }
51
beyowulf

Je l'ai corrigé via le storyboard: cliquez sur votre contrôleur Cliquez sur l'inspecteur d'attributs ViewController> Vérifier utiliser la taille explicite préférée et les valeurs d'entrée. enter image description here

19
Xeieshan

Je n'utilise pas de story-boards. Je viens de présenter un UINavigationController dans le popover:

    self.present(popoverNavigationController!, animated: true) {}

La façon de redimensionner la taille de la fenêtre contextuelle lorsqu'un nouveau contrôleur de vue est poussé, il suffit de changer la taille préférée du contenu avant de le pousser. Par exemple:

    let newViewController = NewViewController()
    popoverNavigationController!.preferredContentSize = CGSize(width: 348, height: 400)
    popoverNavigationController!.pushViewController(newViewController, animated: true)

Le problème est lorsque nous essayons de redimensionner le popover lorsque nous ouvrons un contrôleur de vue.

Si vous utilisez viewWillDisappear du contrôleur de vue actuel pour modifier la taille de contenu préférée du popover, le popover se redimensionnera mais une fois le contrôleur de vue sauté. Cela signifie que l'animation a un retard.

Vous devez modifier le PreferredContentSize avant d'exécuter popViewController. Cela signifie que vous devez créer un bouton de retour personnalisé dans la barre de navigation comme cela est expliqué ici . Il s'agit de l'implémentation mise à jour pour Swift 4:

        self.navigationItem.hidesBackButton = true
        let newBackButton = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(CurrentViewController.backButtonTapped(sender:)))       
        self.navigationItem.leftBarButtonItem = newBackButton

Et exécutez le code suivant lorsque vous appuyez sur le nouveau bouton Précédent:

   @objc func backButtonTapped(sender: UIBarButtonItem) {

        self.navigationController?.preferredContentSize = CGSize(width: 348, height: 200)

        self.navigationController?.popViewController(animated: true)
   }

Fondamentalement, le PreferredContentSize doit être changé avant de pousser et de faire sauter le contrôleur de vue.

1
Ginés SM

Les réponses ci-dessus sont correctes, ce qui indique l'utilisation de preferredContentSize, mais la chose la plus importante est d'implémenter le protocole UIPopoverPresentationControllerDelegate et d'implémenter la méthode ci-dessous sinon cela ne changera pas la taille du contenu comme prévu.

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