6

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

当内容lastUpdateLabel为 nil 或为空白@""时,我需要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的框架发生了变化。

请您告诉我为什么会发生这种情况,以及如何解决。

4

3 回答 3

12

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

于 2013-03-20T22:02:01.647 回答
0

你试过跑步吗

[CATransaction flush];
[CATransaction begin];

更新这些值后在主线程上?

于 2013-03-20T21:36:18.690 回答
-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] 始终在一起。

于 2013-03-20T21:51:02.840 回答