我遇到的问题似乎不应该是一个问题。我正在尝试为我的应用创建评论("聊天")视图,但我使用估计的行高,并且无法找到让评论开始的好方法在底部,这样当加载视图时,最新的评论位于屏幕的底部,就在屏幕底部的输入区域上方。
我已经四处寻找并找到了类似的解决方案:
[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确定)。
我确定这是一个完美的解决方案,因为很多应用都有这样的观点,我无法找到它。我很喜欢这里可能缺少的东西...
答案 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];
等于底行高度,它就会滚动到正确的位置。