UITableViewCell内容四处移动

时间:2013-10-16 00:30:13

标签: iphone ios objective-c uitableview

我有一个iPhone应用程序,其中我使用UITableView格式化一组文本响应,每行一个。我在故事板中设置了一个单元格,在其中有一个标签,并设置一个约束条件,标签应该是距离单元格边缘10个点。然后我设置了UITableViewCell的自定义子类,将故事板中的单元格设置为该类,并连接插座。

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

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

回答一些问题:我正在使用故事板设置视图。 Xcode没有报告任何与约束的歧义。此外,还有以下屏幕截图:

enter image description here enter image description here

6 个答案:

答案 0 :(得分:1)

我的猜测是标签的限制是模棱两可的。由于出于无法解释的原因,歧义可能会使UI组件跳转。您可能需要为标签设置更多约束以定义其在两个轴上的位置。

或者,您可能需要做的就是在IB的“编辑器”菜单下将标签设置为“适合内容的大小”(内在内容大小)。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

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

[cell.contentView addSubview:newLabelOrWhatever];

答案 3 :(得分:1)

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

答案 4 :(得分:0)

I had a similar issue when the label would move when the cell was selected. It was a custom cell that I was loading from a custom Nib.

In the Nib I had not set the backgroundView of the UITableViewCell (superclass) to any view. Once I set it (I set it to the ContentView) the issue stopped.

My auto-layout constrains seems fine and had no issues, so I'm assuming it was the above that fixed it.

答案 5 :(得分:-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