UITableViewCell中的UICollectionView不能正确动态调整大小

时间:2016-12-04 06:31:17

标签: ios uitableview uicollectionview

我在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调用委托cellForRowAt并将具有动态高度的UITableViewCell出列
  • 在NEXT循环周期中,UITableViewCell内的UICollectionView调用其委托numberOfItemsInSection和cellForItemAt来确定UICollectionView contentSize。
  • 现在已经太晚了,因为UITableViewCell已经使用没有单元格的UICollectionView动态调整大小,因此UITablewViewCell高度太短而且不能正确适合UICollectionView。

我通过重新加载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高度?

1 个答案:

答案 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单元格。