UITableView inside UITableViewCell 从底部切割

UITableView inside UITableViewCell cutting from the bottom

我有一个包含 7 种类型的 UITableViewCell 的垂直列表。其中之一包含单元格内的 UITableView。

我的要求是主 table 视图应根据单元格的内部 table 视图内容大小自动调整单元格大小。 os 内部 table 视图将显示其完整长度并且滚动将关闭。

This approach 工作正常,但仅适用于具有 table 视图的单元格。当我在内部 table 视图上方引入 UIImageView(带有异步加载图像)时,单元格的总高度略小于其内容的实际高度。因此内部 table 视图被从底部切掉。

这是错误的表示。

我正在根据宽度设置 UImageView 的高度以正确缩放:

if let media = communityPost.media, media != "" {
                postImageView.sd_setImage(with: URL(string: media), placeholderImage: UIImage(named: "placeholder"), options: .highPriority) { (image, error, cache, url) in
                    if let image = image {
                        
                        let newWidth = self.postImageView.frame.width
                        
                        let scale = newWidth/image.size.width
                        let newHeight = image.size.height * scale
                        
                        if newHeight.isFinite && !newHeight.isNaN && newHeight != 0 {
                            self.postViewHeightConstraint.constant = newHeight
                        } else {
                            self.postViewHeightConstraint.constant = 0
                        }
                        
                        if let choices = communityPost.choices {
                            self.datasource = choices
                        }
                        self.tableView.reloadData()
                    }
                }
            } else {
                self.postViewHeightConstraint.constant = 0
                
                if let choices = communityPost.choices {
                    datasource = choices
                }
                tableView.reloadData()
            }

并且内部 table 视图是 UITableView 的子类:

class PollTableView: UITableView {
    override var intrinsicContentSize: CGSize {
        self.layoutIfNeeded()
        return self.contentSize
    }

    override var contentSize: CGSize {
        didSet{
            self.invalidateIntrinsicContentSize()
        }
    }

    override func reloadData() {
        super.reloadData()
        self.invalidateIntrinsicContentSize()
    }
}

table 主视图设置为使用 automaticDimension 调整大小:


    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        cellHeights[indexPath] = cell.frame.size.height
    }
    
    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return cellHeights[indexPath] ?? UITableView.automaticDimension
    }
    

似乎无法理解出了什么问题。任何帮助表示赞赏。 谢谢。

当 table 视图要求您估计行高时,您正在回调 table 视图。因此,您没有向它提供它还没有的任何信息。 问题可能出在您的异步加载图像上,因此您应该预测图像大小,并在图像尚未加载时为 table 视图提供正确估计的行高。