如何计算tableView的行高并将值传递给heightForRowAtIndexPath函数

9 浏览
0 Comments

如何计算tableView的行高并将值传递给heightForRowAtIndexPath函数

我有一个带有自定义单元格的tableView。

每个单元格都有不同的界面元素,它们的大小也不同。

每个单元格都有不同类型的元素和它们的数量。

所有这些元素都是动态创建的,所以我在创建它们、设置它们的框架并将它们添加为子视图。

所以问题是,heightForRowAtIndexPath在cellForRowAtIndexPath之前执行,而我在cellForRowAtIndexPath中创建行并构建其界面,我不知道如何将计算得到的高度传递给heightForRowAtIndexPath。

我该如何在正确绘制tableView之前计算行高并将其值传递给heightForRowIndexPath?

0
0 Comments

问题的出现原因是:在计算tableView行高时,如果在heightForRowAtIndexPath方法中进行计算,会导致同样的操作被执行两次。

解决方法之一是:在UITableViewCell的子类中添加自定义逻辑,并创建一个静态方法,该方法接收绘制单元格所需的所有数据,并使用字符串大小计算方法计算高度。然后在heightForRowAtIndexPath方法中使用此方法。

解决方法之二是:使用自动布局来布局单元格的子视图,然后将tableView的row height属性设置为UITableViewAutomaticDimension。这样就不需要heightForRow委托方法了。

如果使用heightForRowAtIndexPath方法中计算高度,并在单元格中单独计算高度,会导致执行相同的操作两次。而使用自动布局的方法可以解决此问题,因为它可以适应不同的元素位置,并且不需要连接到行的顶部或底部。另外,在进行cellForRow之前计算高度是另一种操作,因为它不涉及视图的创建,只是字符串大小和自定义边距的计算。

0
0 Comments

问题原因:这个问题的出现是因为在tableView中,我们想要根据cell的内容来动态计算每一行的高度,并将计算得到的高度传递给heightForRowAtIndexPath方法,但是不知道具体如何实现。

解决方法:根据提供的内容,可以得到以下解决方法:

1. 创建一个UITableViewCell的子类。

2. 将所有自定义的元素放置在一个UIView中,然后将这个UIView放置在cell中。

3. 创建三个NSLayoutConstraint,一个从UIView的顶部到cell的顶部,第二个从UIView的底部到cell的底部,第三个设置UIView的高度。

4. 在tableViewController的viewDidLoad方法中,将row height设置为UITableViewAutomaticDimension,即自动计算高度。

5. 在UITableViewCell的子类中创建一个方法,用来计算cell的高度,并修改设置cell高度的NSLayoutConstraint。例如,在adjustHeightOfInnerView方法中,将self.myInnerCellViewHeightConstraint.constant设置为计算得到的高度,并调用self.contentView.setNeedsUpdateConstraints()方法。

6. 在cellForRowAtIndexPath方法中,调用adjustHeightOfTableview方法,例如:cell.adjustHeightOfTableview()。

通过以上步骤,就可以实现动态计算tableView的行高,并将计算得到的高度传递给heightForRowAtIndexPath方法来设置每一行的高度。

如果还有其他问题,请告诉我。谢谢!

0
0 Comments

如何计算tableView行高并将值传递给heightForRowAtIndexPath

如果您的单元格视图非常复杂,并且每个组件的高度都取决于数据源,您可以尝试在heightForRowIndexPath方法中创建视图,然后将创建的视图缓存在视图控制器的字典中,并在cellForRowAtIndexPath中直接使用它。这样,当用户滚动表格时,您只需要创建一次视图。如果数据源不是非常频繁地更改,您也可以在heightForRowIndexPath中重用缓存的视图。

如果表格视图有很多行,您应该在estimatedHeightForRowAtIndexPath中返回一个近似值作为高度,以加快视图控制器的加载过程。否则,在加载表格视图时,它将尝试计算所有行的高度,这可能需要很长时间。

但我真的不认为您的单元格会如此复杂。如果只有一些依赖于数据源的UITextLabels的高度,您只需计算标签的高度,然后将其添加到其他固定组件的高度中。

关于它的复杂性-是的。这是一个社交网络,当我在墙上发布用户帖子时,他们的帖子可能包含文字、图片(最多10张)、音频、视频、文档和其他附件。还可能是一个重新发布,所以所有内容都会稍微偏移,上面会显示帖子创建者的姓名。因此,无法在uitableviewcell.swift文件中计算行高,然后将其传递给原始的heightForRowAtIndexPath,对吗?

不完全正确,您可以仔细检查设计并提取一些模式出来。例如,对于图像、音频、视频或文档,每个单独项的高度通常是固定的,您可以通过numberOfTheItem*eachItemHeight来获得总高度。

这就是问题所在。所以问题是如何正确地将计算出的高度设置为rowHeight。

您可以首先尝试我的解决方案,因为您已经有了创建视图的代码,所以应该非常快。如果它能正常工作,您的问题就解决了。但是,如果您遇到性能问题,那么我们需要找到其他解决方案。

哦,好的。我会尝试的。谢谢你

但是这种方法的不好之处在于,我无法将创建不同行的代码分开,所有这些代码都必须在heightForRowAtIndexPath中,以后阅读和理解起来会很困难

如何在cellForRowAtIndexPath中分离代码?您可以在heightForRowAtIndexPath中以相同的方式进行操作,因为这两个方法具有相同的参数。

在cellForRowAtIndexPath中,我根据indexPath.row创建一个依赖于它们的单元格,并调用其中的函数构建它们的界面。所有的单元格都有不同的类型-自定义UITableViewCell。

我认为您的问题在于单元格类型。您仍然可以在heightForRowAtIndexPath中使用它!对于缓存字典,您使用UITableViewCell作为类型,并在cellForRowAtIndexPath中直接返回缓存视图,无需将其转换为自定义视图。

如果您仍然希望将其转换为相应的类,您可以使用isKindOfClass方法:stackoverflow.com/questions/1368124/…

0