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) }