UITableViewCell 约束更新仅在滚动后发生
UITableViewCell constraint updates only happening after scrolling
我遇到了一个恼人的情况。我发现了类似的问题,但答案对我没有帮助,所以我希望能得到一些建议。
我有一个自定义的 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()
的私有方法,它使用了我添加到 UILabel
到 return 对我来说是设置文本后标签的宽度 - 我会做一些基本计算来调整我想要的标签约束。
我遇到的唯一问题是,当 table 视图最初加载时,标签的宽度没有正确更新,但是当我向下滚动到最初超出框架的单元格时,它们正确显示,然后当我向上滚动到最初位于框架中且未对齐的单元格时,它们也会正确显示。
我知道我以前遇到过这样的问题,但通常在单元格上调用 layoutIfNeeded()
可以解决问题。不是这次。
我知道这与可重用单元格和出队的想法有关,但为什么第一组单元格的布局不遵循相同的规则?这些是用户看到的第一个单元格,我需要它们是正确的!
有人对我有什么建议吗?
编辑
我想我已经针对了这个问题,但我仍然不太清楚该怎么做。我必须根据可用的单元格框架调整我计算出的标签宽度。我添加了一些打印语句来查看单元格宽度是否在变化,确实如此。在 setWidths()
方法中,我添加了 print(self.frame.width)
,当 tableView 首次加载时,它会为每个单元格打印出 325.0
,但是当我滚动并布置新单元格时,它变为 414.0
(使用 iPhone 8 Plus 模拟器)。是什么导致单元格的框架宽度从初始布局到重用单元格时发生变化?
这里的问题是,当单元格尚未呈现时,您正在计算尺寸,请更新您的配置方法以采用 tableview 宽度,就像这样 cell.configure(with: DataForCell, width: tableview.frame.width)
,然后使用该宽度来配置尺寸,以及为什么它从 375 变为 414,答案是您得到的是常规 iphone 的宽度,当呈现视图时,它变为加大尺寸。
我遇到了一个恼人的情况。我发现了类似的问题,但答案对我没有帮助,所以我希望能得到一些建议。
我有一个自定义的 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()
的私有方法,它使用了我添加到 UILabel
到 return 对我来说是设置文本后标签的宽度 - 我会做一些基本计算来调整我想要的标签约束。
我遇到的唯一问题是,当 table 视图最初加载时,标签的宽度没有正确更新,但是当我向下滚动到最初超出框架的单元格时,它们正确显示,然后当我向上滚动到最初位于框架中且未对齐的单元格时,它们也会正确显示。
我知道我以前遇到过这样的问题,但通常在单元格上调用 layoutIfNeeded()
可以解决问题。不是这次。
我知道这与可重用单元格和出队的想法有关,但为什么第一组单元格的布局不遵循相同的规则?这些是用户看到的第一个单元格,我需要它们是正确的!
有人对我有什么建议吗?
编辑
我想我已经针对了这个问题,但我仍然不太清楚该怎么做。我必须根据可用的单元格框架调整我计算出的标签宽度。我添加了一些打印语句来查看单元格宽度是否在变化,确实如此。在 setWidths()
方法中,我添加了 print(self.frame.width)
,当 tableView 首次加载时,它会为每个单元格打印出 325.0
,但是当我滚动并布置新单元格时,它变为 414.0
(使用 iPhone 8 Plus 模拟器)。是什么导致单元格的框架宽度从初始布局到重用单元格时发生变化?
这里的问题是,当单元格尚未呈现时,您正在计算尺寸,请更新您的配置方法以采用 tableview 宽度,就像这样 cell.configure(with: DataForCell, width: tableview.frame.width)
,然后使用该宽度来配置尺寸,以及为什么它从 375 变为 414,答案是您得到的是常规 iphone 的宽度,当呈现视图时,它变为加大尺寸。