更新UITableViewCell子视图的框架没有影响
我有一个自定义(子类)UITableViewCell,其中包含一些UILabels,UIButton和NSBlock作为属性。这个小类叫做ExploreCell
。其中两个属性是UILabels,分别命名为waitLabel
和lastUpdateLabel
。更新UITableViewCell子视图的框架没有影响
当lastUpdateLabel
的内容为零或为空时,即@""
,我需要将waitLabel
垂直向下(在Y轴上)移动10个像素。我通过检查NSDictionary
中的一些对象来执行此操作,如下面的代码所示,该代码已放入-tableView:cellForRowAtIndexPath:
方法中。
CGRect frame = cell.waitLabel.frame;
if ([[venue allKeys] containsObject:@"wait_times"] && ([[venue objectForKey:@"wait_times"] count] > 0)) {
frame.origin.y = 43;
}
else {
frame.origin.y = 53;
}
[cell.waitLabel setFrame:frame];
但是,此代码间歇性地工作,并试图呼吁-setNeedsLayout
,仍然无法正常工作。间歇地说,我的意思是在滚动几次之后,一个或两个符合标准的单元格将单元格的原点向下移动10个像素,实际上它们的框架已更改。
请你可以告诉我为什么会发生这种情况,以及它如何修复。
这看起来像是自动布局的问题。如果你没有明确地关闭它,那么它已经打开。你应该在单元格的顶部(或底部)制作一个约束,并在代码中改变该约束的常量而不是设置框架。根据WWDC 2012视频,如果您使用自动布局,则不应在代码中包含任何setFrame:消息。
您是否尝试过更新这些值后,在主线程上运行
[CATransaction flush];
[CATransaction begin];
?
这是行不通的,我不希望在解决此问题时使用冒险的尝试。 – 2013-03-20 21:38:05
哦,我刚刚看到你这样做。只是不知道为什么它不在那里工作。快速阅读认为这是关于在错误的线程上执行操作的问题。 – 2013-03-20 21:44:58
当您更改任何单元格中的布局并希望立即看到它们时,您需要使用[tableView beginUpdates] + [tableView endUpdates]。
-(void)someMethod
{
[tableView beginUpdates];
// your code:
CGRect frame = cell.waitLabel.frame;
if ([[venue allKeys] containsObject:@"wait_times"] && ([[venue objectForKey:@"wait_times"] count] > 0))
{
frame.origin.y = 43;
}
else {
frame.origin.y = 53;
}
[cell.waitLabel setFrame:frame];
[tableView endUpdates];
}
确保[tableView beginUpdates]和[tableView endUpdates]总是在一起。
这是-beginUpdates和-endUpdates方法的不正确用法。它们专门用于管理批量插入,更新和行删除。 – 2013-03-20 21:52:22
@max_我在我的单元格中具有相同的功能,其中有3个标签,其中2个根据某个布尔值进行了移位和淡入淡出。我添加了beginUpdates和endUpdates到我的代码,它的工作。也许这是因为你有一个自定义的UITableViewCell – AzaFromKaza 2013-03-20 22:00:01
_max是对的 - 不好的做法 – AlexeyVMP 2013-12-31 11:24:18
你把那个代码放在哪里? – Uby 2013-03-20 21:35:12
-cellForRow .... – 2013-03-20 21:36:00
您是否使用自动布局? – rdelmar 2013-03-20 21:45:08