我在UITableViewCell中有一个UICollectionView。
我将UITableViewCell行高设置为动态:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
我的UICollectionView具有可变数量的项目:
func collectionView(_ collectionView: UICollectionView,
numberOfItemsInSection section: Int) -> Int {
return items.count
}
现在,这是引起我头痛的一系列事件:
我通过重新加载UITableView找到了一个丑陋的工作,但我根本不喜欢这种方法:
private func reloadCell() {
let when = DispatchTime.now()
DispatchQueue.main.asyncAfter(deadline: when) {
if let indexPath = self.chatViewController?.chatTableView.indexPath(for: self) {
self.tableView.reloadRows(at: [indexPath], with: .none)
}
}
}
我的问题是,我是否可以强制UICollectionView重新加载并立即调用它的委托,以便autolayout引擎可以正确计算UITableViewCell高度?
答案 0 :(得分:0)
在viewDidLoad中,添加集合视图的观察者
collectionView.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.Old.union(NSKeyValueObservingOptions.New), context: self)
现在,overrider通过KVO观察控制集合视图重载完成处理程序的keypath的值。
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>)
{
// You will get here when the reloadData finished
}
现在,在视图中Will Disappear删除为集合视图设置的观察者。
override func viewWillDisappear(_ animated: Bool) {
{
// remove collection view observer
}
同样的逻辑将应用于tableview,以便在其中获得包含集合视图的完全可见的tableview单元格。