【问题标题】:Problems changing UILabel frame within UITableViewCell在 UITableViewCell 中更改 UILabel 框架的问题
【发布时间】:2014-06-23 09:55:20
【问题描述】:

我有一个包含 UILabel 的自定义 UITableViewCell。我正在尝试动态调整 UILabel 的宽度以正确显示它包含的文本。我知道如何调整 UILabel 的大小,但我注意到 UITableViewCell 在使用 UITableViewCellAccessoryDisclosureIndicator 的附件类型时调整 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. 通过设置框架调整作为 contentView 子视图的 UIView 的大小
  3. UITableViewCell 正在使用 UITableViewCellAccessoryDisclosureIndicator 作为附件。

有没有人知道为什么会发生这种情况以及解决它的方法?谢谢!

【问题讨论】:

  • 尝试创建自定义 UITableViewCell 并重新定义 layoutSubviews 方法,例如:stackoverflow.com/questions/2366802/…
  • 离题(与您的问题无关):1. 使用 ARC 2. 使用 return cell; 而不是 return(cell);
  • 签出accessoryType 他们会从你的单元格中占用额外的空间,它会调整你的标签大小。我建议在分配accessoryType 后更改框架。
  • 我想我可能已经明白了。在自动调整大小以补偿附件之后,似乎 contentView 和 UILabel 的帧大小都在 cellForRowAtIndexPath 函数之外发生了变化。因此,如果我想动态调整 UILabel 的大小,我必须在任何时间点将它基于 contentView.frame.size.width。我想我没有意识到 UIViews 的帧大小实际上在自动调整大小的过程中发生了变化,但回想起来,这是有道理的。这有意义吗?其他人有更好的解决方案吗?
  • 我有类似的问题,还没有得到解决方案。你是什​​么意思'基地'?从超级视图中删除?

标签: ios objective-c uitableview frame


【解决方案1】:

正在发生的情况是 UILabel 和 contentView(这是 UILabel 的父/超级视图)都被调整为更小,以在 cellForRowAtIndexPath 被调用后补偿显示指示器附件。这就是为什么第一次显示单元格时,一切正常。我在 cellForRowAtIndexPath 中将 UILabel 的宽度设置为 290,然后在调用 cellForRowAtIndexPath 后,将 UILabel 的大小从 290 调整为更小的量以正确适应。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多