一直向下滚动到 UITableView 的底部
Posted
技术标签:
【中文标题】一直向下滚动到 UITableView 的底部【英文标题】:Scroll all the way down to the bottom of UITableView 【发布时间】:2016-08-11 03:32:50 【问题描述】:我有一个UITableView
,我正在尝试将 36 行加载到其中,然后一直向下滚动到最后一个单元格。
我试过这个:
func reloadData()
chatroomTableView.reloadData()
chatroomTableView.scrollToBottom(true)
extension UITableView
func scrollToBottom(animated: Bool = true)
let sections = self.numberOfSections
let rows = self.numberOfRowsInSection(sections - 1)
if (rows > 0)
self.scrollToRowAtIndexPath(NSIndexPath(forRow: rows - 1, inSection: sections - 1), atScrollPosition: .Bottom, animated: true)
但它只能向下滚动一半。
【问题讨论】:
rows
和 sections
在您的 scrollToBottom
函数被调用时是否具有预期值?
是的,rows = 36,sections = 1。但它只滚动到第 0 部分的第 10 行。
尝试将您对 scrollToBottom
的调用封装在 dispatch_async
或 dispatch_after
中。
使用 dispatch_async 它将向下滚动到第 24 行,使用 dispatch_after (2 秒) 它滚动到第 22 行。仍然不是我想要的第 36 行。
如果您将解决方案作为单独的答案而不是作为 Nirav D 答案的编辑发布会更好 - 这会使他/您的答案非常混乱。也许可以解释为什么他的回答不足以满足您的需求。
【参考方案1】:
如果您的要求是滚动到tableView
的最后一个cell
,您可以像这样使用setContentOffset
,这样您就可以滚动到tableView
的最后一个单元格。
把这个放在 reloadData() 函数中:
func reloadData()
chatroomTableView.reloadData()
dispatch_async(dispatch_get_main_queue(), () -> Void in
let scrollPoint = CGPoint(x: 0, y: self.chatroomTableView.contentSize.height - self.chatroomTableView.frame.size.height)
self.chatroomTableView.setContentOffset(scrollPoint, animated: true)
)
将此添加到您的 UITableViewDelegate :
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)
let lastRowIndex = tableView.numberOfRowsInSection(0)
if indexPath.row == lastRowIndex - 1
tableView.scrollToBottom(true)
将此添加到 .swift 文件的底部:
extension UITableView
func scrollToBottom(animated: Bool = true)
let sections = self.numberOfSections
let rows = self.numberOfRowsInSection(sections - 1)
if (rows > 0)
self.scrollToRowAtIndexPath(NSIndexPath(forRow: rows - 1, inSection: sections - 1), atScrollPosition: .Bottom, animated: true)
【讨论】:
以上是关于一直向下滚动到 UITableView 的底部的主要内容,如果未能解决你的问题,请参考以下文章
带有插图的 UICollectionView 不会一直向下滚动