2013-03-20 201 views
6

我有一个自定义(子类)UITableViewCell,其中包含一些UILabels,UIButton和NSBlock作为属性。这个小类叫做ExploreCell。其中两个属性是UILabels,分别命名为waitLabellastUpdateLabel更新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个像素,实际上它们的框架已更改。

请你可以告诉我为什么会发生这种情况,以及它如何修复。

+0

你把那个代码放在哪里? – Uby 2013-03-20 21:35:12

+0

-cellForRow .... – 2013-03-20 21:36:00

+0

您是否使用自动布局? – rdelmar 2013-03-20 21:45:08

回答

12

这看起来像是自动布局的问题。如果你没有明确地关闭它,那么它已经打开。你应该在单元格的顶部(或底部)制作一个约束,并在代码中改变该约束的常量而不是设置框架。根据WWDC 2012视频,如果您使用自动布局,则不应在代码中包含任何setFrame:消息。

0

您是否尝试过更新这些值后,在主线程上运行

[CATransaction flush]; 
[CATransaction begin]; 

+0

这是行不通的,我不希望在解决此问题时使用冒险的尝试。 – 2013-03-20 21:38:05

+0

哦,我刚刚看到你这样做。只是不知道为什么它不在那里工作。快速阅读认为这是关于在错误的线程上执行操作的问题。 – 2013-03-20 21:44:58

-3

当您更改任何单元格中的布局并希望立即看到它们时,您需要使用[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]总是在一起。

+0

这是-beginUpdates和-endUpdates方法的不正确用法。它们专门用于管理批量插入,更新和行删除。 – 2013-03-20 21:52:22

+0

@max_我在我的单元格中具有相同的功能,其中有3个标签,其中2个根据某个布尔值进行了移位和淡入淡出。我添加了beginUpdates和endUpdates到我的代码,它的工作。也许这是因为你有一个自定义的UITableViewCell – AzaFromKaza 2013-03-20 22:00:01

+0

_max是对的 - 不好的做法 – AlexeyVMP 2013-12-31 11:24:18