Estoy tratando de agregar un UIPopoverView a mi aplicación Swift iOS 8, pero no puedo acceder a la propiedad PopoverContentSize, ya que el popover no se muestra en la forma correcta. mi código:
var popover: UIPopoverController? = nil
func addCategory() {
var newCategory = storyboard.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
var nav = UINavigationController(rootViewController: newCategory)
popover = UIPopoverController(contentViewController: nav)
popover!.setPopoverContentSize(CGSizeMake(550, 600), animated: true)
popover!.delegate = self
popover!.presentPopoverFromBarButtonItem(self.navigationItem.rightBarButtonItem, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)
}
salida:
Cuando hago lo mismo a través de UIPopoverPresentationController, todavía no lo hago. este es mi código:
func addCategory() {
var popoverContent = self.storyboard.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
var nav = UINavigationController(rootViewController: popoverContent)
nav.modalPresentationStyle = UIModalPresentationStyle.Popover
var popover = nav.popoverPresentationController as UIPopoverPresentationController
popover.delegate = self
popover.popoverContentSize = CGSizeMake(1000, 300)
popover.sourceView = self.view
popover.sourceRect = CGRectMake(100,100,0,0)
self.presentViewController(nav, animated: true, completion: nil)
}
Obtengo exactamente el mismo resultado.
¿Cómo personalizo el tamaño de mi popover? ¡Cualquier ayuda sería muy apreciada!
Respuestas:
Bien, un compañero de casa lo miró y lo descubrió:
Esa es la manera.
Ya no habla con el popover en sí mismo, habla con el controlador de vista dentro de él para establecer el tamaño del contenido, llamando a la propiedad
preferredContentSize
fuente
De hecho, es mucho más sencillo que eso. En el guión gráfico, debe crear el controlador de vista que desea usar como ventana emergente y crear una clase de controlador de vista para él como de costumbre. Haga una transición como se muestra a continuación desde el objeto que desea abrir el popover, en este caso el
UIBarButton
llamado "Config".En el "controlador de vista madre" implemente el
UIPopoverPresentationControllerDelegate
método delegado y:Anule el
prepareForSeque
método de esta manera:Y tu estas listo. Y ahora puede tratar la vista emergente como cualquier otra vista, es decir. agregar campos y lo que no! Y obtienes el controlador de contenido usando el
popoverPresentationController.presentedViewController
método enUIPopoverPresentationController
.También en un iPhone tendrías que sobrescribir
fuente
Encontré un ejemplo completo de cómo hacer que todo esto funcione para que siempre pueda mostrar un popover sin importar el dispositivo / orientación https://github.com/frogcjn/AdaptivePopover_iOS8_Swift .
La clave es implementar UIAdaptivePresentationControllerDelegate
Luego, amplíe el ejemplo anterior (de Imagine Digital):
fuente
UIModalPresentationFullScreen
o bienUIModalPresentationOverFullScreen
". Además, "Si no implementa este método o devuelve cualquier estilo que no seaUIModalPresentationFullScreen
oUIModalPresentationOverFullScreen
, el controlador de presentación ajusta el estilo de presentación alUIModalPresentationFullScreen
estilo".Swift 2.0
Bueno, hice ejercicio. Echar un vistazo. Hizo un ViewController en StoryBoard. Asociado con la clase PopOverViewController.
Ver ViewController:
Nota: El método func showPopover (base: UIView) debe colocarse antes de ViewDidLoad. Espero eso ayude !
fuente
showPopover(base: UIView)
debería colocarse un método antesviewDidLoad()
?En iOS9, UIPopoverController está depreciado. Entonces, puede usar el siguiente código para la versión de Objective-C por encima de iOS9.x,
fuente
Aquí convierto el código Swift "Joris416" a Objective-c,
Recuerde AGREGAR
UIPopoverPresentationControllerDelegate, UIAdaptivePresentationControllerDelegate
fuente
Esto se explica mejor en el blog del día a día de iOS8
En resumen, una vez que haya configurado el modalPresentationStyle de su UIViewController en .Popover, puede obtener una UIPopoverPresentationClass (una nueva clase de iOS8) a través de la propiedad popoverPresentationController del controlador.
fuente
Hice una versión Objective-C de la respuesta rápida de Imagine Digitals arriba. No creo que me haya perdido nada, ya que parece funcionar en las pruebas preliminares, si detecta algo, hágamelo saber y lo actualizaré.
fuente
popover.sourceView = self.view;
mis dos centavos por xcode 9.1 / swift 4.
y experimentar en:
func adaptivePresentationStyle ...
o: return .pageSheet .... y así sucesivamente ..
fuente
Implemente UIAdaptivePresentationControllerDelegate en su Viewcontroller. Luego añade :
fuente
Lo siguiente tiene una guía bastante completa sobre cómo configurar y presentar popovers. https://www.appcoda.com/presentation-controllers-tutorial/
En resumen, una implementación viable (con algunas actualizaciones de la sintaxis del artículo original para Swift 4.2 ), que luego se llamará desde otro lugar, sería algo como lo siguiente:
Mucho de esto ya se cubrió en la respuesta de @mmc, pero el artículo ayuda a explicar algunos de esos elementos de código utilizados y también muestra cómo podría expandirse.
También proporciona una gran cantidad de detalles adicionales sobre el uso de la delegación para manejar el estilo de presentación para iPhone vs. iPad, y para permitir el descarte del popover si alguna vez se muestra en pantalla completa. Nuevamente, actualizado para Swift 4.2 :
Espero que esto ayude.
fuente
¡Para los que quieran estudiar!
Creé un proyecto de código abierto para aquellos que quieran estudiar y usar la vista Popover para cualquier propósito. Puedes encontrar el proyecto aquí. https://github.com/tryWabbit/KTListPopup
fuente