UITableViewCell并在单元格中重新定位UILabel

时间:2014-04-24 18:53:32

标签: ios uitableview autolayout autoresizingmask

我有UITableView我有不同高度的细胞。我已覆盖heightForRowAtIndexPath并通过调用UILabel后确定[lb sizeToFit]高度来计算正确的高度。我得到了每个单元格的正确高度,但是我对于重新定位UILabel的最佳位置r有点模糊。

我试图在cellForRowAtIndexPath中重新定位它们,但这似乎不起作用。所以,在我走得太远之前,这是正确的地方吗?从表面上看它不起作用。

问题:cellForRowAtIndexPath是调整大小和移动控件的正确位置吗?

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

创建您自己的UITableViewCell子类,并覆盖layoutSubviews。记得致电[super layoutSubviews]。然后正确布局单元格以显示您正在显示的任何内容量。 (假设单元格将被赋予正确的框架)

heightForRowAtIndexPath:中,您需要根据细胞如何布置其内容来执行相同的计算。

答案 1 :(得分:1)

确定标签所需的大小,并从表委托方法中返回该高度。

在单元格中,将标签固定到superview的边缘(单元格内容视图)。您可以使用自动调整大小屏幕(灵活宽度+高度)或使用自动布局来执行此操作。在任何一种情况下,这都会使标签自动调整到正确的框架,而无需您做任何其他事情。

答案 2 :(得分:0)

如果你可以让autolayout工作,那么我认为@Wain是最好的主意。有时布局可能对于自动布局而言过于复杂,在这种情况下,您需要在代码中执行此操作。

代码在哪里?你在cellForRowAtIndexPath:中做到这一点的想法是完全可以的。请记住,单元格在其他行遗留的任意状态下出列,因此您不应该依赖于初始条件。 e.g。

UILabel *label3 = (UILabel *)[cell viewWithTag:100];
// give the subviews constant tags (not dependent on row for example)

if (/* this is a short cell, so the third label must be hidden */) {
    label3.alpha = 0.0;
}
// NOT DONE YET!

因为我们不知道label3出队时的状态,我们必须通过提供一个else-block作为if-block的补充来涵盖每个条件。

else {
    // it must be a taller cell
    // or else if, if there are other sizes of cells, etc.
    label3.alpha = 1.0;
}

这可能非常复杂,您可能会发现在您自己的UITableView子类中重新定位此布局逻辑更具可读性,这是@ NickGalasso的好建议。