UITableViewCell约束更新仅在滚动后发生

时间:2019-03-27 23:16:52

标签: ios swift uitableview ios-autolayout

我遇到了一个令人讨厌的情况。我发现了类似的问题,但是答案并没有帮助我,所以我希望可以得到一些建议。

我有一个自定义UITableViewCell,我在其中使用.xib文件。应用加载时,我会获取一些数据,一旦检索到,我就会重新加载tableView。单元格显示图片和一些标签,我需要标签根据单个单元格中内容的文本宽度来调整其大小。假设我有cellForRowAt indexPath的这个东西:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard
        let cell = tableView.dequeueReusableCell(withIdentifier: MyCell.reuseIdentifier, for: indexPath) as? MyCell,
        indexPath.row < myDataArray.count
    else { return UITableViewCell() }

    let dataForCell = myDataArray[indexPath.row]
    cell.configure(with: dataForCell)
    cell.layoutIfNeeded()
    return cell
}

现在在我的MyCell.swift文件中的configure(with:)方法中,设置标签文本,然后我还调用一个名为setWidths()的私有方法,该方法使用了我添加到{{1 }}设置文本后返回标签的宽度-我做一些基本的计算来调整标签的约束。

我唯一的问题是,当表格视图最初加载时,标签的宽度没有正确更新,但是当我向下滚动到最初超出框架的单元格时,它们会正确显示,然后当我向上滚动到最初在框架中并没有对齐的单元格时,它们也将正确显示。

我知道我以前遇到过这样的问题,但是通常在单元格上调用UILabel可以解决此问题。不是这个时候。

我知道这与可重用单元格和出队的思想联系在一起,但是为什么布置的第一组单元格不遵循相同的规则?这些是用户看到的第一个单元格,我需要它们正确无误!

有人对我有什么建议吗?

编辑

我认为我已经解决了这个问题,但是我仍然不知道该怎么办。我必须根据单元格框架的可用情况来调整计算出的标签宽度。我添加了一些打印语句,以查看像元宽度是否正在改变。在layoutIfNeeded()方法内部,我添加了setWidths(),当tableView第一次加载时,它为每个单元格打印出print(self.frame.width),但是当我滚动并布置新的单元格时,它变为{{ 1}}(使用iPhone 8 Plus模拟器)。是什么导致了从初始布局到重新使用单元时单元格的框架宽度发生变化?

1 个答案:

答案 0 :(得分:2)

这里的问题是,当尚未渲染像元时,您正在计算尺寸,请更新您的configure方法以获取表格视图宽度,例如cell.configure(with: DataForCell, width: tableview.frame.width),然后使用该宽度来配置尺寸,以及关于为什么它从375变为414的问题,答案是您正在获取常规iphone的宽度,当渲染视图时,它变为正尺寸。