Ios 基于单元格宽度更改UITableViewCell内容的首选方法

Ios 基于单元格宽度更改UITableViewCell内容的首选方法,ios,objective-c,uitableview,ios8,autolayout,Ios,Objective C,Uitableview,Ios8,Autolayout,我有一个动态定制的UITableViewCell,它利用了自动布局 我根据单元格的宽度改变标签的文本内容 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ... cell.someLabel.text = CGRectGetWidth(cell.bounds) < 321 ? @"Concise" : @"Much

我有一个动态定制的
UITableViewCell
,它利用了自动布局

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ...
    cell.someLabel.text = CGRectGetWidth(cell.bounds) < 321 ? @"Concise" : @"Much longer blurb";

    return cell;
}
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
...
cell.someLabel.text=CGRectGetWidth(cell.bounds)<321?@“简明”:“更长的模糊”;
返回单元;
}
在方向转换期间调用重新加载数据,以更新标签


虽然这种方法碰巧有效,但我认为有一种更好的方法来处理这种情况,它不涉及重新加载tableView的开销

(无需更改任何约束条件。标签位于同一位置,但在空间更大时仅显示不同的内容。)

  • 我是否应该子类化
    UILabel
    ,并更改
    -didmovetoserview
    中的文本

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


谢谢你的回答

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

-(void)layoutSubviews {
    self.someLabel.text = CGRectGetWidth(self.bounds) < 321 ? @"Concise" : @"Much longer blurb";
    [super layoutSubviews];
}
-(无效)布局子视图{
self.someLabel.text=CGRectGetWidth(self.bounds)<321?@“简明”:“更长的模糊”;
[超级布局子视图];
}

“这不涉及重新加载表视图的开销”我认为首先要做的是重新思考为什么您认为重新加载表视图是“开销”。这是非常有效的,因为只有可见的表单元格数据实际上是新获取的-并且您的数据模型应该是完全有效的,否则您就做错了。马特,这看起来太过分了。由于自动旋转,自动布局已经发生,我猜它可以在已经发生的布局过程中正确处理。我只是不太了解自动布局,不知道单元格或标签应该如何处理它。但我没有提到的问题是,如果没有重新加载,你将看不到重新加载的微妙闪烁。如果我不必重新加载表格,它只需自动旋转并重新绘制(使用不同的内容),看起来会更好。可能?如果不重新加载,“不同的内容”从何而来?这一切都是通过尝试学习如何制作IB_可设计的自定义控件实现的。标签是子类化的,有一个IBInspectable属性告诉它它的内容是什么,它最初来自
-tableView:CellForRowatineXpath:
。现在的情况是标签已经知道了它的内容,只需要在内容的短版本和长版本之间切换。我正在使用
-viewwillTransitionOnSize:withTransitionCoordinator:
我想尝试在自动布局中处理这一切(因为可见单元格已经对转换作出反应,而无需重新加载表格)。我只需要找出实际更改文本的位置。如果视觉细胞已经做出反应,那么为什么不将文本的更改放在发生反应的任何地方?这是我的想法,但我不知道该放在哪个方法中,而且我从来没有修改过
-layoutSubviews
,如果这是正确的重写方法。Will div如果没有人知道答案,请在几天内进入未知领域,并尝试发现文本的更改应该发生在哪里。
layoutSubviews
可能是一种方法,除非您想按照我的建议执行并创建自己的方法。
layoutSubviews
在每次自动布局完成任务时都会被调用,因此应该在那里更改它很简单,记住也要调用super,否则可能会导致各种奇怪的事情(我从经验中知道。)我将
layoutSubviews
添加到我的自定义
UITableviewCell
,更改标签的文本(基于单元格宽度),然后调用super。它看起来很棒,整个动画都恢复到了非常平滑的状态,因为我不需要重新加载数据。如果你更新你的答案,我会把它标记为接受。谢谢你的帮助!