【发布时间】:2014-01-04 18:53:47
【问题描述】:
我有一个带有单元格的表格视图,它有时有一个可选的 UI 元素,有时它必须被删除。 根据元素调整标签大小。
当单元格初始化时,它会比稍后的要窄。当我将数据设置到标签中时,此代码从cellForRowAtIndexPath:调用
if (someFlag) {
// This causes layout to be invalidated
[flagIcon removeFromSuperview];
[cell setNeedsLayout];
}
之后,单元格返回到表格视图,并显示出来。但是,此时的文本标签已调整其宽度,但未调整高度。大约一秒钟后调整高度,当所有单元格都已显示时,抖动清晰可见。
重要说明,这仅在最初创建前几个单元格期间。一旦它们被重用,一切都很好,因为可选视图被移除并且标签的大小已经与以前的用法一样正确。
为什么在setNeedsLayout 之后但在显示之前没有完全重新布局单元格? UIKit不应该在显示前检查无效布局吗?
如果我这样做
if (someFlag) {
[flagIcon removeFromSuperview];
[cell layoutIfNeeded];
}
所有内容都立即调整,但编写代码的方式似乎不正确,我觉得我错过了其他东西。
更多关于如何创建单元格的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
ProfileCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
[cell setData:model.items[indexPath.row] forMyself:YES];
return cell;
}
// And in ProfileCell:
- (void)setData:(Entity *)data forMyself:(BOOL)forMe
{
self.entity = data;
[self.problematicLabel setText:data.attributedBody];
// Set data in other subviews as well
if (forMe) {
// This causes layouts to be invalidated, and problematicLabel should resize
[self.reportButton removeFromSuperview];
[self layoutIfNeeded];
}
}
另外,如果重要的话,在故事板单元格中看起来像这样,一旦删除标志图标,可选约束就会接管:
【问题讨论】:
-
您使用的是库存
UITableViewCells 还是自定义单元格? -
你能添加所有的 cellForRowAtIndexPath: 方法吗?如果您这样做,我想我将能够为您提供帮助:)
-
好的。这是我在使用
UITableViews时(痛苦地)学到的东西。UITableViews 的drawRect方法不称为“总是”。我想您正在使用dequeueReusableCellWithCellIdentifier重用单元格。您可以尝试做的一件事是在willDisplayCell方法中放置一个[yourCell drawRect]。每当单元格即将移动到可见边界时,总是会调用此方法。此外,setNeedsLayout和setNeedsDisplay是对内存征税的方法,在具有大量内容的单元格中。 -
@Refael.S 我已经添加了代码,虽然代码不多,但我很确定。还添加了它在故事板中的外观。
-
@n00bProgrammer 谢谢,但是调用
drawRect比layoutIfNeeded更糟糕。此外,问题在于新单元格,而不是重复使用的单元格。
标签: ios uitableview autolayout