gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 21:48:16 24 4
gpt4 key购买 nike

编辑:https://streamable.com/rfym将在行动中展示它。我第一次按滚动到底部时,它并没有一直滚动到底部。然后,我手动一直到底部,然后快速向上滚动。再次按下 Scroll To Bottom 后,它会正常工作,因为它使用的是缓存高度。

所以,我已经看到了很多答案,但似乎没有一个对我有用,而且我很确定这些对其他许多人也不起作用:

tableView.setContentOffset(CGPointMake(0, CGFloat.max), animated: 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:我有一个搞笑的解决方案……它非常笨拙……而且 Not Acceptable ……但从技术上讲它是可行的。附加娱乐。

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:在初始滚动时使用自定义/可变单元格高度滚动到底部不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32744124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com