案件
通常,您将使用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/