更新UITableViewCell子视图的帧无效

时间:2013-03-20 21:26:34

标签: ios objective-c uitableview uilabel

我有一个自定义(子类)UITableViewCell,它包含一些UILabel,一个UIButton和一个NSBlock作为属性。该子类称为ExploreCell。其中两个属性是UILabel,分别命名为waitLabellastUpdateLabel

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个像素,实际上它们的waitLabel框架发生了变化。

请告诉我为什么会这样,以及如何解决这个问题。

3 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:0)

您是否尝试过

[CATransaction flush];
[CATransaction begin];
更新这些值后在主线程上

答案 2 :(得分:-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]总是在一起。