uitableview swift resize popover

uitableview - ¿Cómo ajusto mi popover al tamaño del contenido en mi tableview en swift?



resize (5)

Estoy usando popoverPresentationController para mostrar mi popover. El UITableViewController utilizado para mostrar como popover se crea mediante programación y generalmente contendrá de 1 a 5 filas. ¿Cómo configuro esta ventana emergente para ajustar el tamaño al contenido de la vista de tabla?

Código para mi popover:

if recognizer.state == .Began { let translation = recognizer.locationInView(view) // Create popoverViewController var popoverViewController = UITableViewController() popoverViewController.modalPresentationStyle = UIModalPresentationStyle.Popover popoverViewController.tableView.backgroundColor = UIColor.popupColor() // Settings for the popover let popover = popoverViewController.popoverPresentationController! popover.delegate = self popover.sourceView = self.view popover.sourceRect = CGRect(x: translation.x, y: translation.y, width: 0, height: 0) popover.backgroundColor = UIColor.popupColor() presentViewController(popoverViewController, animated: true, completion: nil) }


En el viewDidLoad() su UITableViewController puede agregar un observador:

self.tableView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil)

A continuación, agregue este método:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { self.preferredContentSize = tableView.contentSize }

Por último, en viewDidDisappear() , asegúrate de eliminar el observador:

tableView.removeObserver(self, forKeyPath: "contentSize")

De esta manera, la ventana emergente ajustará automáticamente el tamaño para adaptarse al contenido, siempre que se cargue o cambie.


Para swift 4, si desea observar el tamaño del contenido, encontré que esta es la solución óptima. Informándolo aquí ya que no encontré un ejemplo completo en línea:

class MyTableViewController: UITableViewController { private var kvoContext = 0 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) addObserver(self, forKeyPath: #keyPath(tableView.contentSize), options: .new, context: &kvoContext) } override func viewDidDisappear(_ animated: Bool) { removeObserver(self, forKeyPath: #keyPath(tableView.contentSize)) super.viewDidDisappear(animated) } override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if context == &kvoContext, keyPath == #keyPath(tableView.contentSize), let contentSize = change?[NSKeyValueChangeKey.newKey] as? CGSize { self.popoverPresentationController?.presentedViewController.preferredContentSize = contentSize } } }


Primero lo primero: todos los comentarios son buenos y la ayuda completa. He hecho pocos cambios en mi lógica, lo que hace que mi VC sea un componente reutilizable.

Llamando a este método dentro de viewWillAppear:(BOOL)animated :

-(void) setPopOverPreferedContentHeight { if (self.popoverPresentationController && self.tableView.contentSize.height < MAX_POPOVER_HEIGHT) { self.preferredContentSize=self.tableView.contentSize; } else if (self.popoverPresentationController){ self.preferredContentSize = CGSizeMake(self.tableView.contentSize.width, MAX_POPOVER_HEIGHT); } }


Reemplace la propiedad preferredContentSize en su extensión del uitableviewcontroller siguiente manera:

override var preferredContentSize: CGSize { get { let height = calculate the height here.... return CGSize(width: super.preferredContentSize.width, height: height) } set { super.preferredContentSize = newValue } }

Para calcular la altura, consulte tableView.rectForSection(<#section: Int#>)