在UITableViewCell中更改UILabel帧的问题

时间:2014-05-06 16:54:48

标签: ios objective-c uitableview frame

我有一个包含UILabel的自定义UITableViewCell。我正在尝试动态调整UILabel的宽度以正确显示它包含的文本。我知道如何调整UILabel的大小,但我注意到UITableViewCell在使用UITableViewCellAccessoryDisclosureIndicator的accessoryType时调整UILabel的方式有些奇怪的行为。单元格设置如下:

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(15, 0, 145, 31)];
label.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin;
label.backgroundColor = [UIColor blueColor]; // So that I can see the frame
[cell.contentView addSubview:label];

然后我有一个典型的cellForRowAtIndexPath实现,如下所示:

- (UITableViewCell *)tableView:(UITableView *)_table_view cellForRowAtIndexPath:(NSIndexPath *)_index_path
{
    static NSString *cell_id = @"Cell";
    CustomTableViewCell *cell = (CustomTableViewCell *)[_table_view dequeueReusableCellWithIdentifier:cell_id];

    if(!cell)
    {
        cell = [[[CustomTableViewCell alloc] initWithReuseIdentifier:cell_id] autorelease];
    }

    // Resize UILabel frame.  Note: assume that CustomTableViewCell has label property
    cell.label.frame = CGRectMake(15, 0, 290, 31);
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    cell.editingAccessoryType = UITableViewCellAccessoryDisclosureIndicator;

    return(cell);
}

第一次分配CustomTableViewCell时,一切都很好。即使UILabel的宽度为290,它也会缩小以适应细胞,因为细胞需要空间来显示披露指示。当我从表格视图切换(例如切换到不同的选项卡等)时会出现问题。当我回到表视图时,不会分配CustomTableViewCell,因为它是从dequeueReusableCellWithIdentifier函数返回的。当通过设置框架来调整UILabel的大小时,单元格似乎不再尊重应该调整UILabel以适应披露指标的事实,并导致UILabel与披露指标重叠。

当出现以下条件时,UITableViewCell似乎无法自动调整子视图的大小:

  1. 使用dequeueReusableCellWithIdentifier返回的UITableViewCell
  2. 通过设置框架
  3. 调整UIView的大小,该视图是contentView的子视图
  4. UITableViewCell使用UITableViewCellAccessoryDisclosureIndicator作为附件。
  5. 有没有人知道为什么会发生这种情况并找到解决办法?谢谢!

1 个答案:

答案 0 :(得分:0)

正在发生的事情是,在调用cellForRowAtIndexPath之后,UILabel和contentView(UILabel的父/超级视图)的大小调整得较小,以补偿披露指标附件。这就是为什么第一次显示单元格时,一切正常。我在cellForRowAtIndexPath中将UILabel的宽度设置为290,然后UILabel从290调整为较小的量,以便在调用cellForRowAtIndexPath后的某个时刻正确拟合。

下一次显示单元格并从dequeueReusableCellWithIdentifier函数中检索它时,它已经具有之前的披露指标,因此已经调整了较小的尺寸。当我再次将宽度重置为290时,它从未调整大小以适应,因为披露指示已经存在。因此,UILabel太大了。

基本上,我需要相对于它的父视图(contentView)的大小来调整UILabel的大小,而不是使用静态值290.这样如果单元格还没有调整大小(这是第一次的情况)将显示单元格)它将适当调整大小。如果单元格已经调整大小,那么父视图将根据contentView设置UILabel宽度,这将产生所需的行为。