5

我有一个 iPhone 应用程序,我在其中使用 UITableView 来格式化一组文本响应,每行一个。我已经在情节提要中设置了单元格,使其内部有一个标签,并设置了一个约束,即标签应该距离单元格边缘 10 个点。然后我设置了一个自定义子类UITableViewCell,将情节提要中的单元格设置为该类,并连接了插座。

但是,当我加载表格时,在某些情况下,我看到单元格中的文本略微向右移动:当我选择单元格时,或者当我将其他单元格加载到表格中时。事实上,在后一种情况下,有时一切都会向右移动,甚至是已经存在的单元格!

这到底是怎么回事?我所做的唯一更改是tableView:cellForRowAtIndexPath:标签中的文本,我一直在设置它。而且我在情节提要的单元格上取消了“编辑时缩进”。

回答一些问题:我正在使用情节提要设置视图。Xcode 没有报告任何含糊不清的约束。另外,这里是之前和之后的屏幕截图:

在此处输入图像描述 在此处输入图像描述

4

6 回答 6

1

这只是一个猜测,没有看到你的代码。我曾经遇到过类似的问题,当应用程序重用现有单元格时,标签的尺寸不正确。因此,在添加新标签之前,我必须删除 cellForRowAtIndexPath 方法中的旧标签。这是我删除旧的方法:

UIView *oldLabel = [cell viewWithTag:3];
if (oldLabel != nil)
{
    [oldLabel removeFromSuperview];
}

然后我添加了一个这样的新标签:

[cell.contentView addSubview:newLabelOrWhatever];
于 2013-10-25T16:44:49.923 回答
1

可能值得检查一下您的字符串内容上没有前缀空格。此外,您可以通过设置背景颜色来验证标签的实际位置。

于 2013-10-25T21:31:30.780 回答
1

我的猜测是标签的约束是模棱两可的。模棱两可会使 UI 组件因为莫名其妙的原因跳来跳去。您可能需要为标签设置更多约束以定义其在两个轴上的位置。

或者,也许您需要做的只是将标签设置为 IB 的编辑器菜单下的“适合内容的大小”(固有内容大小)。

于 2013-10-16T02:18:41.187 回答
1

您是否向 UITableViewCell 添加了新标签,或者您是否正在使用其中已经存在的 textLabel?如果您添加了新的,请考虑将其删除并改用单元格的现有 textLabel 属性。如果由于某种原因这不是一个选项,请仔细检查您添加的标签是否在单元格的 contentView 中,并且所有约束都相对于父视图,而不是相对于单元格本身。

此外,为了调试,您可以将单元格的 contentView 背景颜色设置为红色 (cell.contentView.backgroundColor = [UIColor redColor];) - 这可能会让您更好地了解正在移动的内容、标签或整个视图。

于 2013-10-23T13:39:31.873 回答
0

I had a similar issue when the label would move when the cell was selected. 这是我从自定义 Nib 加载的自定义单元格。

在 Nib 中,我没有将 UITableViewCell(超类)的 backgroundView 设置为任何视图。一旦我设置它(我将它设置为 ContentView),问题就停止了。

我的自动布局约束似乎很好并且没有问题,所以我假设是上面修复了它。

于 2016-04-18T08:48:52.487 回答
-1

如果您有自定义子类UITableViewCell,请尝试实现layoutSubviews. 让我从头顶尝试:

static CGFloat const kLeftMargin = 10.0f;

- (void) layoutSubviews
{
  [super layoutSubviews];

  /* Prepare for processing */
  CGSize cellSize = self.bounds.size;

  /* Change the textLabel frame */
  {
    /* Compute the new label frame */
    CGSize labelSize = self.textLabel.bounds.size;
    CGFloat xCoor = kLeftMargin;
    CGFloat yCoor = roundf((cellSize.height - labelSize.height) / 2.0f);
    CGRect labelFrame = CGRectMake(xCoor, yCoor,
                                   labelSize.width, labelSize.height);

    /* Set the new label frame */
    self.textLabel.frame = labelFrame;
  }
}

现在,这不是通常推荐的(因为很多人使用 Storyboard 和 NIB),但根据经验,如果您想要完成一些正确的布局,请实现layoutSubviews.

于 2013-10-19T08:44:12.880 回答