ios swift popover uipopover

ios - UIPopoverPresentationController mostrando popover como pantalla completa



swift (4)

Estoy tratando de usar UIPopoverPresentationController para mostrar un popover que no ocupa toda la pantalla. He seguido muchos tutoriales diferentes sin suerte.

Aquí está mi código. Crea una instancia correcta de ViewController , pero ocupa toda la pantalla en lugar de solo una pantalla más pequeña como definí en preferredContentSize .

func showPopover() { let vc = self.storyboard?.instantiateViewControllerWithIdentifier("PopupTimePickerViewController") as PopupTimePickerViewController vc.modalPresentationStyle = .Popover vc.preferredContentSize = CGSizeMake(200, 100) if let presentationController = vc.popoverPresentationController { presentationController.delegate = self presentationController.permittedArrowDirections = .Up presentationController.sourceView = self.view presentationController.sourceRect = CGRectMake(0, 0, 50, 50) self.presentViewController(vc, animated: true, completion: nil) } }

Actualización 27/09/16 con la respuesta correcta

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


En iPhone, debe agregar lo siguiente para presentar un popover.

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController!) -> UIModalPresentationStyle { // Return no adaptive presentation style, use default presentation behaviour return .None }


La respuesta aceptada es correcta. Para más información, consulte Adaptación de los controladores de vista presentados a un nuevo estilo en los documentos de Apple:

Utilice el método adaptivePresentationStyleForPresentationController: de delegado para especificar un estilo de presentación diferente del predeterminado. Al realizar la transición a un entorno compacto, los únicos estilos admitidos son los dos estilos de pantalla completa o UIModalPresentationNone . La devolución de UIModalPresentationNone le indica al controlador de presentación que ignore el entorno compacto y continúe utilizando el estilo de presentación anterior. En el caso de un popover, ignorar el cambio le da el mismo comportamiento de popover similar al iPad en todos los dispositivos.

Asegúrese de que se cumplan las configuraciones requeridas de Presentar un Controlador de Vista en un Popover :

Después de configurar el estilo de presentación modal [del controlador de vista presentado] en UIModalPresentationPopover , configure los siguientes atributos relacionados con popover:

  • Establezca la propiedad preferredContentSize de su controlador de vista en el tamaño deseado.
  • Establezca el punto de anclaje popover utilizando el objeto UIPopoverPresentationController asociado, al que se puede acceder desde la propiedad popoverPresentationController del controlador de popoverPresentationController .
  • Establezca solo uno de los siguientes:
    • Establezca la propiedad barButtonItem en un elemento de botón de barra.
    • Establezca las propiedades sourceView y sourceRect en una región específica en una de sus vistas.

Para Swift3 + / IOS10 +, cuando se trata de iPhone:

Debe agregar UIPopoverPresentationControllerDelegate al delegado en:

class YourClass: UIViewController, UIPopoverPresentationControllerDelegate { ...

Luego implemente en esta misma clase para padres (que mostrará el popover) el método a continuación.

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

Y luego configure la configuración de popover a continuación:

myPopover.modalPresentationStyle = .popover myPopover.popoverPresentationController?.sourceRect = VIEWTOPOINTTHEARROW.frame myPopover.popoverPresentationController?.sourceView = self.view myPopover.popoverPresentationController?.delegate = self

También puede establecer alguna configuración para la clase popover

class MyPopover: UIViewController { override func viewDidLoad() { super.viewDidLoad() //popover size self.preferredContentSize = CGSize(width: 320, height: 200) //sets the arrow of the popover to same color of background self.popoverPresentationController?.backgroundColor = self.view.backgroundColor } }


Para Swift3 / IOS10, parece que tenemos que hacer algo como

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

Agregando esta respuesta, en caso de que alguien se encuentre con este problema como lo hice al migrar a swift3 / IOS10