检测UITableView何时滚动到底部

Jos*_*Mum 28 uitableview ios swift

以下帖子仍然是检测UITableView实例何时滚动到底部[在Swift中],或者是否已被更改(如:改进)的可接受方式?

检测UITableView是否已滚动到底部时出现问题

谢谢.

Anb*_*hik 60

试试这个

 func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let height = scrollView.frame.size.height
    let contentYoffset = scrollView.contentOffset.y
    let distanceFromBottom = scrollView.contentSize.height - contentYoffset
    if distanceFromBottom < height {
        print(" you reached end of the table")
    }
}
Run Code Online (Sandbox Code Playgroud)

或者你可以这样找到

if tableView.contentOffset.y >= (tableView.contentSize.height - tableView.frame.size.height) {    
    //you reached end of the table
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@ Anbu.Karthik.我可能会这样做.我感到震惊*这种原始方法仍然需要在2016年使用,但也是如此.什么阻止工程师引入"func scrollViewDidScrollToBottom"功能? (6认同)
  • 不用担心@ Anbu.Karthik,我只是在抱怨。 (3认同)
  • 我必须将 if 条件更改为“if distanceFromBottom &lt;= height”才能使其正常工作。 (2认同)

Gia*_*ang 37

斯威夫特3

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if indexPath.row + 1 == yourArray.count {
        print("do something")
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案仅在有1个部分时有效.当有更多部分时,需要累积左侧的行. (8认同)
  • 如果if indexPath.section == COUNT_OF_SECTIONS-1 {如果indexPath.row +1 == LAST_DATA_SET.count {print(“做某事”)` (4认同)
  • 这似乎是对我最好的答案 (2认同)
  • 如果单元格很少,那么当表最初加载数据时将调用打印语句。绝对不推荐 (2认同)

onm*_*133 7

在斯威夫特 4

func scrollViewDidScroll(_ scrollView: UIScrollView) {
  let isReachingEnd = scrollView.contentOffset.y >= 0
      && scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)
}
Run Code Online (Sandbox Code Playgroud)

如果你实现了 expandable UITableView/UICollectionView,你可能需要检查scrollView.contentSize.height >= scrollView.frame.size.height


JPe*_*ric 6

我们可以避免使用scrollViewDidScroll和使用tableView:willDisplayCell

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if indexPath.section == tableView.numberOfSections - 1 &&
        indexPath.row == tableView.numberOfRows(inSection: indexPath.section) - 1 {
        // Notify interested parties that end has been reached
    }
}
Run Code Online (Sandbox Code Playgroud)

这适用于任何数量的部分

  • 我相信tableView为最初加载的每个单元格调用此方法。例如,如果有26个单元,并且它首先加载13,则它将在第一次reloadData()调用时调用13次。因此,如果您有13个单元格并且加载了13个单元格,它将调用willDisplay,并且您将得到一个错误的肯定说法,即用户到达了最低点。我相信...有人确认 (2认同)