2016-02-04 69 views
0

我对Apple的动态调整大小的单元格有问题,例如我的单元格布局的逻辑不像只有少数几个叠加的UILabel那样被切割和干燥。iOS计算单元格的高度

因此,我无法真正使用它们提供的动态调整大小选项,因此我需要使用NSString boundingRect方法手动计算单元格的高度。

这很好 - 它的工作原理,但我最终需要存储很多常量来跟踪我的自动布局约束。我觉得这是违反自动布局应该为我做的直觉,所以我不确定这是否是实现heightForRowAtIndexPath的正确方法。

我基本上必须将我的约束复制到一个常量中,然后在类方法中使用这些值来生成我的高度。 Apple对UITableViewAutomaticDimension的工作原理提供了很少的内部见解,但很明显,在布局之前,单元格的高度仍然是计算出来的。因此我不能真正添加​​任何复杂的逻辑,除非我知道之前调用的方法。

关于我应该做什么或者我的方法是否正确的想法?

+1

“我的细胞布局逻辑不像切割和干燥” - 逻辑是什么? – kelin

+0

boundingRect不是计算标签(或其他)大小的正确方法,-sizeToFit或-sizeThatFits:是正确的 – Andrea

+0

@kelin我有两个标签。如果左侧标签的宽度切入正确的标签,请将右侧标签右侧的标签移动。如果左边的标签需要多行,也可以将右边的标签移动到左边的标签下面。 –

回答

0

我可以提供的通用解决方案是为您的单元格添加高度约束,并根据需要更改约束,无论它们是什么。 UITableViewAutomaticDimension会将单元格的大小自动调整为您使用此约束指定的高度。

+0

是的,但我可以在哪里修改高度限制? LayoutSubviews被调用得太晚 - 单元的高度由该点决定。如果在初始化后立即设置,所有子视图的帧都是错误的。 –

0

如果你的表格单元格的自定义那么它更容易,如果你使用像configureCell的方法和indexPath从cellForRowAtIndexPath传递给它,然后确定基于您已经和数据的布局看到你想要的左边和右边的标签将被置于。完成此操作后,将存储模型中所需的高度,或者存储与您的表具有相同行数的另一个阵列的高度,然后使用它返回heightForRowAtIndexPath

这样更容易,而且不需要调整过多的表视图委托方法就可以提供灵活性。在一个地方集中布局逻辑。 另一种替代方法是覆盖表视图单元格的layoutSubviews并计算其高度并存储它。

+0

谢谢,我看到原型单元格类型的方法比我所期望的更普遍。我喜欢你描述得更好的第二种方法,但这不起作用。 layoutSubviews是在计算高度后调用的,所以我不会在时间上有高度。 –

+0

如果你有一个自定义单元,那么或许你最好的选择是使用第一种方法。如果您想基于内容重新排列标签,那么我认为您必须事先计算高度并将其返回,然后在layoutSubviews中,您可以根据文本大小将标签移动到右侧或下侧。你是对的layoutSubviews不能用于计算高度。高度已经确定在那个点上。 –

0

如果您希望为您的tableview单元格分配一个默认高度,则可以使用estimatedHeightForRowAtIndexPath:在UITableViewDelegate中可用。按照Apple指导原则:

//使用estimatedHeight方法快速计算猜测值,这将允许快速加载表格。 //如果实现了这些方法,则上述-tableView:heightForXXX调用将被延迟,直到可以显示视图为止,因此可以在其中放置更昂贵的逻辑。