根据单元格宽度更改 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:获取单元格中 UILabel 的确切宽度