案件

通常,您将使用cellForRowAtIndexPath委托(delegate)方法来设置您的单元格。为单元格设置的信息对于如何绘制单元格以及尺寸大小很重要。

不幸的是,在heightForRowAtIndexPath委托(delegate)方法之前调用了cellForRowAtIndexPath委托(delegate)方法,因此我们不能简单地告诉委托(delegate)人返回单元格的高度,因为此时该高度为零。

因此,我们需要在表格中绘制单元格之前计算大小。幸运的是,有一种方法可以做到这一点,sizeWithFont,它属于NSString类。但是,有一个问题,为了动态计算正确的大小,需要知道如何显示单元中的元素。我将在一个示例中阐明这一点:

想象一个UITableViewCell,其中包含一个名为textLabel的标签。在cellForRowAtIndexPath委托(delegate)方法中,我们放置textLabel.numberOfLines = 0,该方法基本上告诉标签它可以根据需要显示任意宽度的行,以显示特定宽度的文本。如果我们给textLabel一个大于原始给textLabel的宽度的文本,就会出现问题。第二行将出现,但单元格的高度不会自动调整,因此我们将表格 View 弄得一团糟。

如前所述,我们可以使用sizeWithFont来计算高度,但是它需要知道使用哪个Font字体,什么宽度等等。如果出于简单起见,我们只关心宽度,则可以硬编码宽度为大约320.0(不考虑填充)。但是,如果我们使用UITableViewStyleGrouped而不是普通的宽度,那么宽度将在300.0左右,并且单元将再次困惑。或者,如果我们从肖像换成风景会发生什么,我们有更多的空间,但是由于我们对300.0进行了硬编码,因此不会使用它。

在这种情况下,您有时必须问自己一个问题,您可以避免硬编码多少。

我自己的想法

您可以调用属于UITableView类的cellForRowAtIndexPath方法来获取特定节和行的单元格。我读了几篇文章,说您不想这样做,但我不太了解。是的,我同意它将已经分配了该单元格,但是heightForRowAtIndexPath委托(delegate)方法仅针对可见的单元格调用,因此无论如何都将分配该单元格。如果正确使用dequeueReusableCellWithIdentifier,则不会在cellForRowAtIndexPath方法中再次分配该单元格,而是使用一个指针,并且仅调整属性。那是什么问题

请注意,该单元格未在cellForRowAtIndexPath委托(delegate)方法内绘制,当表格 View 单元格可见时,脚本将在UITableVieCell上调用setNeedDisplay方法,这将触发drawRect方法绘制该单元格。因此,直接调用cellForRowAtIndexPath委托(delegate)不会丢失性能,因为它需要绘制两次。

好的,因此,通过在cellForRowAtIndexPath委托(delegate)方法中调用heightForRowAtIndexPath委托(delegate)方法,我们收到了有关确定单元格大小所需的所有信息。

也许您可以创建自己的sizeForCell方法,该方法通过所有选项运行,如果单元格为Value1样式或Value2等,该怎么办。

结论/问题

这只是我在思想中描述的一种理论,我想知道我写的东西是否正确。或者,也许还有另一种方法可以完成同一件事。请注意,我希望能够做的事情尽可能灵活。

最佳答案



这是不正确的。表格 View 需要为表格 View 中的所有行(而不只是当前显示的行)调用heightForRowAtIndexPath(如果已实现)。原因是它需要计算出总高度才能显示正确的滚动指示器。

关于iphone - UITableView灵活/动态heightForRowAtIndexPath,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2213024/

10-12 02:02