动态 UITableViewCell 不根据内容调整大小

Posted

技术标签:

【中文标题】动态 UITableViewCell 不根据内容调整大小【英文标题】:Dynamic UITableViewCell not resizing according to the content 【发布时间】:2016-12-27 11:16:11 【问题描述】:

Senario A: 如果我在cellForRowAtIndexPath 中设置标签内容,则单元格会正确调整大小。

场景 B: 如果我在单元格中更改自定义操作中的文本内容,则单元格大小不会改变。(我确实调用了 setNeedsLayout + layoutIfNeeded)

如何解决这个问题?

编辑:

1) 我已经设置, myTableView.estimatedRowHeight = 71.0 myTableView.rowHeight = UITableViewAutomaticDimension

2) 我已经正确添加了自动布局约束。

【问题讨论】:

您是否将标签行大小设置为 0?行的高度也为 UITableViewAutomaticDimension ? 阅读教程 1. - raywenderlich.com/129059/self-sizing-table-view-cells 2. -appcoda.com/self-sizing-cells 更新标签内容后有没有试过tableView.beginUpdates()后跟tableView.endUpdates() 请把问题发布得更详细。比如当你想调整单元格大小时?点击或任何操作?需要更多细节 @Thilina ,我的回答对你有用吗? 【参考方案1】:

我遇到了这个问题,我的问题是我将内容限制为selfUITableViewCell)而不是self.contentView(单元格的contentView)。希望这可以帮助其他使用代码构建单元的人!

【讨论】:

非常感谢,我挣扎了一整天才看到你的回答【参考方案2】:

在我的例子中,单元格的自定义大小已启用:

【讨论】:

【参考方案3】:

更改单元格的文本后,只需重新加载该特定单元格或直接调用mainTableView.reloadData()

要重新加载该单元格-

//indexPath is indexPath of cell you just changed label of
mainTableView.reloadRows(at: indexPath, with: .automatic)

【讨论】:

我想在用户单击单元格时显示不同的文本。所以重新加载表格并不能解决我的问题。 每当您更新UITableView 时,由于单元格的可重用性,您需要跟踪使用模型所做的任何更改。更改文本后,如果滚动屏幕,您的更改将丢失。示例:在您的cellForRow 中,您必须最初将标签设置为某物,如果您更改它并再次滚动而不更新模型,则该值将丢失。【参考方案4】:

在我的例子中,在同一个单元格中,我在左上角有一个带有“容器中垂直居中”约束和“顶部空间容器”约束的 imageView。

显然要满足这两个约束,单元格的高度必须等于:

(imageView的高度/2)+(顶部空间容器约束的长度)。

这个高度不足以容纳标签文本,所以我的标签只有 1 行可见。

在我删除了 imageView 的顶部约束后,所有这些都到了正确的位置,在我的情况下,我希望图像居中,如果图像必须留在左上角,我必须取消“垂直居中容器”约束。

我希望这可以帮助某人。

【讨论】:

【参考方案5】:

首先,我不知道你对UITableViewCell 采取了什么行动。所以,我假设我在UITableViewCell 选择中这样做。

以下答案仅适用于 iOS 9 及更高版本

但是,由于某种原因,它未能在 iOS 8 直到它滚动中做到这一点。所以,我会更新 ios 8 的答案。

我看到您在项目中使用了UITableViewestimatedRowHeightrowHeight。所以,

请检查以下内容

    确保UITableViewestimatedRowHeightrowHeight 包含在viewDidLoad() 确保您的 UILabel 行设置为 0

    确保您的 UILabel 没有关于高度的限制,并让这些限制是这样的

如果还包括其他组件,请确保仅包括底部和顶部空间限制或顶部空间到容器边距和底部空间到容器边距。

    每次要更新单元格时,无论当前情况如何,都必须重新加载 tableView。

所以,在你尝试这个示例项目之前不要说任何话,@Rikh 答案仍然有效。可能是你走错了方向。这是解决方案。请按照我说的一步一步做,如果没有成功,请告诉我。您可能需要分享导致您的示例项目。

示例演示 - DynamicCellDemo

iOS 8 更新:为 iOS 8 用户更新以下代码

override func viewDidAppear(_ animated: Bool) 
    super.viewDidAppear(animated)
    if #available(iOS 9, *) 
        // do nothing
     else 
        tblDynamic.reloadData()
    

【讨论】:

【参考方案6】:

您可以做的是从顶部、底部、前导和尾随的所有侧面为单元格中存在的标签设置自动布局约束。然后将以下 UITableViewDelegate 方法添加到您的类中。

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    return UITableViewAutomaticDimension


func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat 
    return 500

这将完成这项工作。现在表格视图单元格中的内容会自动调整单元格的高度。

【讨论】:

我已经完成了 myTableView.estimatedRowHeight = 71.0 myTableView.rowHeight = UITableViewAutomaticDimension 好的.. 这也将为这些委托方法发挥作用。您只需要为我的答案中引用的标签设置自动布局约束。【参考方案7】:

如果可行,试试这个:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 

     return UITableViewAutomaticDimension



 func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat 

    return UITableViewAutomaticDimension


【讨论】:

【参考方案8】:

在 viewDidLoad() 中添加以下内容

-(void)viewDidLoad
   [super viewDidLoad];
   tableView.rowHeight = UITableViewAutomaticDimension
   tableView.estimatedRowHeight = 140

【讨论】:

以上是关于动态 UITableViewCell 不根据内容调整大小的主要内容,如果未能解决你的问题,请参考以下文章

带有动态内容的滚动视图的 iOS UITableViewCell

根据单元格宽度更改 UITableViewCell 内容的首选方法

我需要设置 UITableViewCell 动态高度,带有 UIImageView 的多个动态标签

具有动态 UILabel 和内容压缩/阻力的 UITableViewCell 高度不正确

根据 UILabel 动态调整 uitableViewCell 大小(带段落间距)

具有动态内容、动态布局和动态高度的 UITableViewCell