web-dev-qa-db-fra.com

Pourquoi la séquence 'present as popover' couvre-t-elle tout l'écran?

Dans mon projet, un bouton se trouve en bas à droite de l'écran et j'ai ajouté un autre contrôleur uiview au storyboard, puis j'ai appuyé en maintenant la touche de contrôle enfoncée sur le contrôleur uiview que je voulais comme Popover, puis j'ai réglé la taille de ce contrôleur de contrôle sur (300, 300) 'utiliser une taille explicite préférée'. Lorsque je charge l'application et que je clique sur le bouton, la totalité de l'écran est recouverte par le "popover". J'ai également essayé d'aller dans le fichier .m de popoverViewController et de définir la taille, mais cela ne fonctionnait pas non plus.
Des idées?

Edit: Puisqu'il semble que je dois l'avoir en plein écran, c'est bien, mais je rencontre encore d'autres problèmes que j'avais auparavant. Mon écran contextuel va apparaître et je crée un fond noir et alpha au format .5 pour le rendre visible, mais l'animation est terminée. Une fois l'animation terminée, l'écran passe de l'opacité .5 au noir absolu. Ce que je peux voir, c’est l’icône de la batterie.

15
coal175

Le PO utilise Objective-C. Cette réponse présente le code dans Swift. La conversion de Swift en Objective-C devrait être facile.

Dans le ViewController nouvellement ajouté, sous «Métriques simulées», modifiez «Taille» en «Forme libre» et «Barre d'état» en «Aucune». 

Sous «Taille simulée», modifiez la hauteur et la largeur de votre affichage en fonction de la taille réelle de votre contenu popover.

Créez une transition vers le VC nouvellement ajouté. Utilisez le type de séquence comme "Present As Popover" et nommez-le, par exemple "popoverSegue". 

Dans le ViewConroller à partir duquel cette séquence doit être déclenchée, ajoutez le protocole UIPopoverPresentationControllerDelegate.

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {
}

Remplacez la fonction prepareForSegue pour capturer votre transition popover. Définissez modalPresentationStyle sur .Popover pour indiquer explicitement que vous souhaitez un popover, puis affectez la propriété délégué du popoverPresentationController de la vue à self:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "popoverSegue" {
            let popoverViewController = segue.destinationViewController as! UIViewController
            popoverViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
            popoverViewController.popoverPresentationController!.delegate = self
        }
    }

Implémentez la fonction adaptivePresentationStyleForPresentationController pour indiquer à votre application que vous souhaitez réellement cette présentation popover et n'acceptera aucune substitution:

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.None
    }

Suite à cela, je pourrais obtenir un popup sur iPhone qui n’est pas plein écran mais la taille définie pour le ViewController. 

 enter image description here

Source: Popovers de style iPad sur l'iPhone avec Swift

24
Bharat

Version Swift 3

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == SEGUE_IDENTIFIER {
            let popoverViewController = segue.destination as! YourViewController

            popoverViewController.modalPresentationStyle = UIModalPresentationStyle.popover
            popoverViewController.popoverPresentationController!.delegate = self
        }
    }

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

Merci à Bharat pour la bonne réponse , j’utilise personnellement un UIStoryboardSegue qui fait à peu près la même chose. De cette façon, je peux changer la classe de la transition dans le storyboard, avoir ce que je veux et ne pas polluer mes ViewControllers:

class AlwaysPopupSegue : UIStoryboardSegue, UIPopoverPresentationControllerDelegate
{
    override init(identifier: String?, source: UIViewController, destination: UIViewController)
    {
        super.init(identifier: identifier, source: source, destination: destination)
        destination.modalPresentationStyle = UIModalPresentationStyle.popover
        destination.popoverPresentationController!.delegate = self
    }
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.none
    }
}
5
Michel Donais

Sur iPhone, vous pouvez créer un contrôleur de vue personnalisé capable de gérer tous les popovers. Étant donné que chaque contrôleur de vue dispose de son propre contrôleur de navigation, vous pouvez ajouter un nouveau contrôleur de vue au contrôleur app.window.rootview comme un affichage et le placer au premier plan.

Si vous ne voulez pas écrire le vôtre, vous pouvez utiliser quelque chose comme ceci, par exemple: http://cocoapods.org/pods/FPPopover

0
Chitimalli

Swift 4 Version

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "SegueIdentifier" {
            let popoverViewController = segue.destination
            popoverViewController.modalPresentationStyle = .popover
            popoverViewController.presentationController?.delegate = self
     }
}

N'oubliez pas d'ajouter

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