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

Posted

技术标签:

【中文标题】根据单元格宽度更改 UITableViewCell 内容的首选方法【英文标题】:Preferred approach for changing UITableViewCell content based on cell width 【发布时间】:2014-12-30 22:49:03 【问题描述】:

我有一个利用自动布局的动态自定义UITableViewCell

我根据单元格的宽度改变标签的文本内容。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    ...
    cell.someLabel.text = CGRectGetWidth(cell.bounds) < 321 ? @"Concise" : @"Much longer blurb";

    return cell;

在方向转换期间调用reloadData 以更新标签。

虽然这恰好可行,但我想有一种更好的方法来处理这个问题,它不涉及重新加载 tableView 的开销。

(任何约束都不需要更改。标签在同一个地方,只是在有更多空间时显示不同的内容。)

我应该继承UILabel 并更改-didMoveToSuperview 中的文本吗?

是否可以更改-layoutSubViews 中的文本? (这不会因为文本被更改而导致另一个布局通过吗?)

感谢您的任何回答!

【问题讨论】:

“不涉及重新加载 tableView 的开销”我认为首先要做的是重新考虑为什么您认为重新加载 table view 是“开销”。这是非常有效的,因为实际上只有可见的表格单元格数据是新获取的 - 而且您的数据模型应该是完全有效的,否则您做错了。 这看起来有点矫枉过正,马特。由于自动旋转,自动布局已经在发生,我猜它可以在已经发生的布局过程中处理。我只是对自动布局知之甚少,不知道单元格或标签应该如何处理它。 但是我没有提到的问题是重新加载的微妙闪烁,如果没有重新加载,您将看不到。如果我不必重新加载表格,它会看起来更好,它只是自动旋转并重新绘制自己(具有不同的内容)。可能吗? 不重新加载,“不同的内容”从何而来? 这一切都是通过尝试学习如何制作 IB_Designable 自定义控件来实现的。标签是子类化的,并且有一个 IBInspectable 属性,告诉它它的内容是什么,最初来自-tableView:cellForRowAtIndexPath:。情况是标签已经知道它的内容,只需要在短版内容和长版内容之间交替。 【参考方案1】:

只需将此逻辑添加到layoutSubviews 即可解决问题。每次自动布局引擎执行其操作时都会调用它。

-(void)layoutSubviews 
    self.someLabel.text = CGRectGetWidth(self.bounds) < 321 ? @"Concise" : @"Much longer blurb";
    [super layoutSubviews];

【讨论】:

我正在使用-viewWillTransitionToSize:withTransitionCoordinator: 我想尝试在自动布局中处理这一切(因为可见单元格已经对转换做出反应而无需重新加载表格)。我只需要找到实际更改文本的位置。 如果视觉细胞已经在做出反应,那么为什么不把文本的变化放在发生反应的地方呢? 这是我的想法,但我不知道该使用哪种方法,而且我从来没有修改过-layoutSubviews,如果那是正确的覆盖方法。几天后将深入未知领域,并尝试发现文本更改应该发生在哪里,如果没有人知道答案的话。 layoutSubviews 可能是要走的路,除非你想按照我的建议去做并创建自己的方法。 layoutSubviews 每次自动布局执行其操作时都会被调用,因此更改它应该很简单,只要记住也要调用 super 否则它可能会导致各种奇怪的东西(我从经验中知道;)) 我将layoutSubviews 添加到我的自定义UITableviewCell,更改了标签的文本(基于单元格宽度),然后调用了super。它看起来很棒,并且现在我不必重新加载数据,整个动画又恢复了非常流畅。如果您要更新答案,我会将其标记为已接受。感谢您的帮助!

以上是关于根据单元格宽度更改 UITableViewCell 内容的首选方法的主要内容,如果未能解决你的问题,请参考以下文章

更改 uitableviewcell 的宽度

如何更改 UITableViewCell 宽度?

何时何地根据实际宽度更新 UITableViewCell 子视图的约束

UITableViewCell:获取单元格中 UILabel 的确切宽度

确定分组自定义单元格的 UITableViewCell 宽度的正确方法?

UITableViewCell 中的 UIButtons 不显示 textLabel 更改,直到单元格滚出屏幕