ios – UITableView:在初始滚动时,使用自定义可变单元格高度滚动到底部是不准确的

ios – UITableView:在初始滚动时,使用自定义可变单元格高度滚动到底部是不准确的,第1张

概述编辑: https://streamable.com/rfym将显示它的实际效果.我第一次按下Scroll To Bottom,它并没有一直到底.然后我手动一直到底部并快速向后滚动.一旦我再次按下Scroll To Bottom,它就能正常工作,因为它正在使用cachedHeights. 所以,我已经看到了很多这方面的答案,但它们似乎都不适合我,我很确定这些也不适用于其他许多人: tableVie 编辑: https://streamable.com/rfym将显示它的实际效果.我第一次按下Scroll To Bottom,它并没有一直到底.然后我手动一直到底部并快速向后滚动.一旦我再次按下Scroll To Bottom,它就能正常工作,因为它正在使用cachedHeights.

所以,我已经看到了很多这方面的答案,但它们似乎都不适合我,我很确定这些也不适用于其他许多人:

tableVIEw.setContentOffset(CGPointMake(0,CGfloat.max),动画:true):

砰的一声,我的tableVIEw消失了.

tableVIEw.setContentOffset(CGPointMake(0,self.tableVIEw.contentSize.height – self.tableVIEw.frame.size.height),animated:true):

不准确的.它并没有一直到底.有时它会超调!

tableVIEw.scrollToRowAtIndexPath(NSIndexPath(forRow:self.replIEs.count – 1,inSection:0),atScrollposition:.Bottom,animated:true)

同样,与前一个一样,这是不准确的.

我知道为什么这是不准确的.我需要的是一个解决方案……

以下是一些要运行的代码:

class ReplIEstableVIEwController: UItableVIEwController {    var cachedHeights = [Int: CGfloat]()    overrIDe func vIEwDIDLoad() {        super.vIEwDIDLoad()        tableVIEw.rowHeight = UItableVIEwautomaticDimension    }    overrIDe func tableVIEw(tableVIEw: UItableVIEw,willdisplayCell cell: UItableVIEwCell,forRowAtIndexPath indexPath: NSIndexPath) {        self.cachedHeights[indexPath.row] = cell.frame.size.height    }    overrIDe func tableVIEw(tableVIEw: UItableVIEw,estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGfloat {        if let height = cachedHeights[indexPath.row] {            return height        } else {            return 113        }    }}

请记住,只有初始滚动到底部并不是一直都是这样.如果我用手指一直向下滚动到底部,然后向上滚动到顶部并触发滚动到底部,这将是完美的.

原因很简单:我将在每个单元格上触发tableVIEw.willdisplayCell,这意味着所有高度都已缓存.这意味着tableVIEw.estimatedHeightForRowAtIndexPath在初始滚动后完美运行.

但是,如果我从不滚动到底部来缓存所有高度,我尝试以编程方式滚动到底部,它将无法到达那里.为什么?因为我有tableVIEw.estimatedHeightForRowAtIndexPath返回113.

有些人可能会说我需要更准确的估计,但我拒绝接受这种想法.我的细胞可以小到50,大到5000.没有准确的估计.

我该如何缓解这种情况?

也许我需要在不同的时间缓存所有高峰?现在几点了?我不想对自己做任何计算. tableVIEw.willdisplayCell的美妙之处在于我可以缓存cell.frame.size.height而不是自己繁琐的计算.

编辑2:我有一个搞笑的解决方案……这是非常笨重的…而且是不可接受的……但从技术上讲它是有效的.适合娱乐.

func scrollToBottom() {    self.tableVIEw.scrollToRowAtIndexPath(NSIndexPath(forRow: self.replIEs.count - 1,inSection: 0),atScrollposition: .Bottom,animated: true)}overrIDe func scrollVIEwDIDEndScrollingAnimation(scrollVIEw: UIScrollVIEw) {    if !atBottom {        self.tableVIEw.setContentOffset(CGPointMake(0,tableVIEw.contentOffset.y + 200),animated: true)    }}overrIDe func scrollVIEwDIDScroll(scrollVIEw: UIScrollVIEw) {    atBottom = scrollVIEw.contentOffset.y >= (scrollVIEw.contentSize.height - scrollVIEw.frame.size.height)}
解决方法
self.tableVIEw.rowHeight = UItableVIEwautomaticDimension;self.tableVIEw.estimatedRowHeight = 113.0; // set to whatever your "average" cell height is

这样你的tableCell将重新定位,而不会提到你提到的不准确性

更新:(删除此功能)

overrIDe func tableVIEw(tableVIEw: UItableVIEw,estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGfloat {    if let height = cachedHeights[indexPath.row] {        return height    } else {        return 113    }}
总结

以上是内存溢出为你收集整理的ios – UITableView:在初始滚动时,使用自定义/可变单元格高度滚动到底部是不准确的全部内容,希望文章能够帮你解决ios – UITableView:在初始滚动时,使用自定义/可变单元格高度滚动到底部是不准确的所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1004380.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存