【发布时间】: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:。情况是标签已经知道它的内容,只需要在短版内容和长版内容之间交替。
标签: ios objective-c uitableview ios8 autolayout