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#>)
Compruebe la propiedad preferredContentSize de UIViewController :
let height = yourDataArray.count * Int(popOverViewController.tableView.rowHeight)
popOverViewController.preferredContentSize = CGSize(width: 300, height: height)