使用估计的行高时,将UITableView滚动到底部

时间:2014-11-29 16:05:36

标签: ios uitableview

我遇到的问题似乎不应该是一个问题。我正在尝试为我的应用创建评论("聊天")视图,但我使用估计的行高,并且无法找到让评论开始的好方法在底部,这样当加载视图时,最新的评论位于屏幕的底部,就在屏幕底部的输入区域上方。

我已经四处寻找并找到了类似的解决方案:

[self.tblComments scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

不能很好地工作,因为它使用了估计的行高,这并不总是正确的(某些注释会更长)。

[self.tblComments setContentInset:UIEdgeInsetsMake(self.tblComments.bounds.size.height - self.tblComments.contentSize.height, 0, 0, 0)];

与上述相同的问题(contentSize由estimatedRowHeight确定)。

我确定这是一个完美的解决方案,因为很多应用都有这样的观点,我无法找到它。我很喜欢这里可能缺少的东西...

1 个答案:

答案 0 :(得分:2)

编辑:

contentSize只是"The size of the content view."但是,由于您为estimatedRowHeight设置了一个值,因此假设您的所有非屏幕单元格都是estimatedRowHeight高度。

根据文档,这里是estimatedRowHeight

的要点
  

提供行高的非负估计可以提高加载表视图的性能。如果表包含可变高度行,则在加载表时计算所有高度可能会很昂贵。使用估计允许您将几何计算的一些成本从加载时间推迟到滚动时间。

所以基本上,为了节省时间,表格根据您的estimatedRowHeight假设行高和内容大小。使用estimatedRowHeight,您要求UITableView制作这些“快捷方式”以提高效果。您基本上是在告诉程序不要提前计算行高,因此为了获得任何屏幕外内容的行高和内容大小,您必须手动计算它们。只要您决定设置estimatedRowHeight,这是不可避免的。

我的猜测是,您查看过的许多聊天应用都没有使用estimatedRowHeight来避免此问题......

但是,如果你确实感觉好像使用estimatedRowHeight有助于你的应用的表现,这里有两个建议。

建议#1

也许有一个totalChatHeight变量是有意义的,你可以跟踪它们进入时的总行高,使用与heightForRowAtIndexPath:方法类似的逻辑计算。通过最初在后台计算此信息作为注释加载然后递增,您仍然可以保持使用estimatedRowHeight的性能优势,而不会牺牲使表知道其行高的功能。

通过执行此操作,您可以构建contentOffset语句,使用已知的表行高度信息滚动到底部:

CGPoint bottomOffset = CGPointMake(0, totalChatHeight - self.tblComments.frame.size.height);
[self.tblComments setContentOffset:bottomOffset animated:YES];

建议#2

另一个建议是动态计算行平均值,以便对estimatedRowHeight进行更精确的衡量,contentSize的{​​{1}}在使用或不使用{时大致相同{1}}。这样UITableView 实际估算行高,估计的内容大小也应该接近实际estimatedRowHeight,因此这个标准estimatedRowHeight公式应该有效:< / p>

contentSize

虽然聊天记录和舍入错误都会增加,但这可能会很危险。

建议#3&lt; - 也许是这种情况下最好的方法

这个第三个建议可能是您最容易实施的,因为它不需要任何持续的计算:

在重新加载表格数据之前,只需将contentOffset设置为最后一行的高度。

您可以使用CGPoint bottomOffset = CGPointMake(0, self.tblComments.contentSize.height - self.tblComments.frame.size.height); [self.tblComments setContentOffset:bottomOffset animated:YES]; 中使用的任何算法计算新行的高度,然后将estimatedRowHeight设置为该高度;这样你可以使用这个语句滚动到最后一个单元格

heightForRowAtIndexPath:

即使如你所说,它确定了基于estimatedRowHeight的行位置,只要[self.tblComments scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 等于底行高度,它就会滚动到正确的位置。