UIModalPresentationPopover pour iPhone 6 Plus en mode paysage n'affiche pas popover

Je veux toujours présenter un ViewController dans un popover sur tous les appareils et toutes les orientations. J'ai essayé d'accomplir cela en adoptant le UIPopoverPresentationControllerDelegate et en définissant le sourceView et le sourceView .

Cela fonctionne très bien pour tous les appareils et les orientations, à l'exception de l'iPhone 6 Plus en paysage. Dans ce cas, le controller de vue glisse du bas de l'écran dans une feuille de formulaire. Comment puis-je empêcher cela pour qu'il apparaisse toujours dans un popover?

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { let popoverPresentationController = segue.destinationViewController.popoverPresentationController popoverPresentationController?.delegate = self popoverPresentationController?.sourceView = self.titleLabel!.superview popoverPresentationController?.sourceRect = self.titleLabel!.frame } func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle { return UIModalPresentationStyle.None } 

Tous les appareils sont sous iOS 8.2 ou supérieur

Implémentez la nouvelle méthode UIAdaptivePresentationControllerDelegate : UIAdaptivePresentationControllerDelegate : de UIAdaptivePresentationControllerDelegate :

 - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller traitCollection:(UITraitCollection *)traitCollection { // This method is called in iOS 8.3 or later regardless of trait collection, in which case use the original presentation style (UIModalPresentationNone signals no adaptation) return UIModalPresentationNone; } 

UIModalPresentationNone indique au controller de présentation d'utiliser le style de présentation d'origine qui, dans votre cas, affichera un survol.

Apple a conçu la présentation iPhone 6 Plus pour se comporter de cette façon, en fonction de sa class de taille.

Pour éviter la présentation modale sur l'iPhone 6 Plus, vous devrez replace la collection de traits (taille horizontale).

Vous devriez pouvoir définir la propriété overrideTraitCollection pour le controller de présentation:

 presentedVC.presentationController.overrideTraitCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact]; 

(Désolé pour l'objective C! Je n'ai pas encore appris Swift.)

Dans Swift 3, si vous avez implémenté la méthode originale adaptivePresentationStyle , il suffit d'append ce code:

 func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { return adaptivePresentationStyle(for: controller) }