課題事例
- 元々、画面全体がUIScrollViewになっていて、真ん中にUITableViewを差し込みたい(※新規画面なら全体をUITableViewにすれば済む話ではあります)。
- 画面全体をスクロールさせる点に変わりはないので、UITableViewはスクロールさせない。
- UITableViewはcell数が可変、かつcellごとの高さも違っていて、それに応じてUITableViewの高さを変えたい(そうしないと全てのcellが表示されなかったり、余白ができてしまったりするので)。
解決法
(1) 高さのconstraintを変数に格納。
private weak var tableViewHeightConstraint: NSLayoutConstraint?
(2) KVO(Key Value Observing)でUITableViewのcontentSize.heightを監視。
NSKeyValueObservationを格納するための変数を宣言し、UITableViewのcontentSize.heightをobserve。
heightが変わった時に上の制約のconstantをセットする処理を定義する。
private var observation: NSKeyValueObservation?
override func viewDidLoad() {
// 略
observation = tableView.observe(\.contentSize, options: [.new]) { [weak self] (_, _) in
guard let self = self else { return }
self.tableViewHeightConstraint?.constant = self.tableView.contentSize.height
}
}
(3) 後始末
deinit {
observation?.invalidate()
observation = nil
}
私は以上のような解決法で課題をクリアできましたが、もっとシンプルな解決法をご存知でしたら、ぜひ教えてください。