ios - rotacion - UIModalPresentationPopover para iPhone 6 Plus en modo horizontal no muestra popover
rotar pantalla iphone 6 (3)
Quiero presentar siempre un ViewController
en una ventana emergente en todos los dispositivos y todas las orientaciones. Intenté lograr esto adoptando el UIPopoverPresentationControllerDelegate
y configurando sourceView
y sourceRect
.
Esto funciona muy bien para todos los dispositivos y orientaciones, excepto el iPhone 6 Plus en modo horizontal. En ese caso, el controlador de vista se desliza hacia arriba desde la parte inferior de la pantalla en una hoja de formulario. ¿Cómo puedo evitarlo para que siempre aparezca en una ventana emergente?
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 }
Todos los dispositivos están bajo iOS 8.2 o superior
Apple diseñó la presentación del iPhone 6 Plus para comportarse de esa manera, en función de su tamaño.
Para evitar la presentación modal en el iPhone 6 Plus, deberá anular la colección de rasgos (tamaño horizontal).
Debería poder establecer la propiedad overrideTraitCollection
para el controlador de presentación:
presentedVC.presentationController.overrideTraitCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact];
(¡Perdón por el Objetivo C! Aún no he aprendido Swift).
En Swift 3, si implementó el método original adaptivePresentationStyle
, simplemente agregando este código funciona:
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
return adaptivePresentationStyle(for: controller)
}
Implemente el nuevo adaptivePresentationStyleForPresentationController:traitCollection:
método 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
le dice al controlador de presentación que use el estilo de presentación original, que en su caso mostrará una ventana emergente.