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 oUIModalPresentationNone
. La devolución deUIModalPresentationNone
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 propiedadpopoverPresentationController
del controlador depopoverPresentationController
.- Establezca solo uno de los siguientes:
- Establezca la propiedad
barButtonItem
en un elemento de botón de barra.- Establezca las propiedades
sourceView
ysourceRect
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