Ответ 1
Оформить preferredContentSize свойство UIViewController:
let height = yourDataArray.count * Int(popOverViewController.tableView.rowHeight)
popOverViewController.preferredContentSize = CGSize(width: 300, height: height)
Я использую popoverPresentationController
, чтобы показать свой popover. UITableViewController
, используемый для показа как popover, создается программно и обычно содержит от 1 до 5 строк. Как настроить этот popover для настройки размера содержимого таблицы?
Код для моего 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)
}
Оформить preferredContentSize свойство UIViewController:
let height = yourDataArray.count * Int(popOverViewController.tableView.rowHeight)
popOverViewController.preferredContentSize = CGSize(width: 300, height: height)
Отмените свойство preferredContentSize
в расширении uitableviewcontroller
следующим образом:
override var preferredContentSize: CGSize {
get {
let height = calculate the height here....
return CGSize(width: super.preferredContentSize.width, height: height)
}
set { super.preferredContentSize = newValue }
}
Для расчета высоты проверки tableView.rectForSection(<#section: Int#>)
В вашем UITableViewController viewDidLoad()
вы можете добавить наблюдателя:
self.tableView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil)
Затем добавьте этот метод:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
self.preferredContentSize = tableView.contentSize
}
Наконец, в viewDidDisappear()
убедитесь, что вы удалили наблюдателя:
tableView.removeObserver(self, forKeyPath: "contentSize")
Таким образом, popover автоматически настраивает размер, чтобы он соответствовал содержимому, всякий раз, когда он загружается или изменяется.
Первое дело: все комментарии хороши и помогают. Я немного изменил свою логику, что делает мой VC как компонент многократного использования.
Вызов этого метода внутри 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);
}
}
Для быстрого 4, если вы хотите наблюдать размер содержимого, я нашел, что это оптимальное решение. Сообщая об этом здесь, так как я не нашел полного примера в Интернете:
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
}
}
}