我有一个iPhone应用程序,其中我使用UITableView格式化一组文本响应,每行一个。我在故事板中设置了一个单元格,在其中有一个标签,并设置一个约束条件,标签应该是距离单元格边缘10个点。然后我设置了UITableViewCell
的自定义子类,将故事板中的单元格设置为该类,并连接插座。
然而,当我加载表格时,在某些情况下,我看到单元格中的文本略微向右移动:当我选择单元格时,或者当我将其他单元格加载到表格中时。事实上,在后一种情况下,有时候一切都会转移到右边,甚至已经存在的细胞!
这到底是怎么回事?我在tableView:cellForRowAtIndexPath:
中所做的唯一更改是标签中的文字,我总是设置它。而且我在故事板中的单元格上取消了“编辑时缩进”。
回答一些问题:我正在使用故事板设置视图。 Xcode没有报告任何与约束的歧义。此外,还有以下屏幕截图:
答案 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
。