skip to Main Content

add new data to the tableview when the scroll is above 50% of the content, but the problem is that after adding the scroll moves with the content to the top, how can I save the location and scroll ? changed the display contents of the table that would start from the bottom

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    if (self.lastContentOffset > scrollView.contentOffset.y && loadEarlierShowF) {
        let height = scrollView.frame.size.height
        let cHeight = scrollView.contentSize.height
        let contentYoffset = scrollView.contentOffset.y
        let distanceFromBottom = scrollView.contentSize.height - contentYoffset
        print(distanceFromBottom)
        let eght = cHeight / 100 * 50
        if distanceFromBottom >= eght {

            actionLoadEarlier()

        }
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    if (indexPath.row == 0) {
        let cell = tableView.dequeueReusableCell(withIdentifier: "RCSectionHeaderCell", for: indexPath) as! RCSectionHeaderCell
        cell.bindData(indexPath, messagesView: self)
        return cell
    }

    if (indexPath.row == 1) {
        let cell = tableView.dequeueReusableCell(withIdentifier: "RCBubbleHeaderCell", for: indexPath) as! RCBubbleHeaderCell
        cell.bindData(indexPath, messagesView: self)
        return cell
    }

    if (indexPath.row == 2) {
        let rcmessage = self.rcmessage(indexPath)
        if (rcmessage.type == RC_TYPE_STATUS) {
            let cell = tableView.dequeueReusableCell(withIdentifier: "RCStatusCell", for: indexPath) as! RCStatusCell
            cell.bindData(indexPath, messagesView: self)
            return cell
        }
        if (rcmessage.type == RC_TYPE_TEXT) {
            let cell = tableView.dequeueReusableCell(withIdentifier: "RCTextMessageCell", for: indexPath) as! RCTextMessageCell
            cell.bindData(indexPath, messagesView: self)
            let numSections = self.tableView.numberOfSections
            if numSections == 1  {
                updateTableContentInset()
            }
            return cell
        }

    }

    if (indexPath.row == 3) {
        let cell = tableView.dequeueReusableCell(withIdentifier: "RCBubbleFooterCell", for: indexPath) as! RCBubbleFooterCell
        cell.bindData(indexPath, messagesView: self)
        return cell
    }

    if (indexPath.row == 4) {
        let cell = tableView.dequeueReusableCell(withIdentifier: "RCSectionFooterCell", for: indexPath) as! RCSectionFooterCell
        cell.bindData(indexPath, messagesView: self)
        return cell
    }

    return UITableViewCell()
}
func updateTableContentInset() {
    let numSections = self.tableView.numberOfSections

    var contentInsetTop = self.tableView.bounds.size.height

    for section in 0..<numSections {
        let numRows = self.tableView.numberOfRows(inSection: section)
        let sectionHeaderHeight = self.tableView.rectForHeader(inSection: section).size.height
        let sectionFooterHeight = self.tableView.rectForFooter(inSection: section).size.height
        contentInsetTop -= sectionHeaderHeight + sectionFooterHeight
        for i in 0..<numRows {
            let rowHeight = self.tableView.rectForRow(at: IndexPath(item: i, section: section)).size.height
            contentInsetTop -= rowHeight
            if contentInsetTop <= 0 {
                contentInsetTop = 0
                break
            }
        }

        if contentInsetTop == 0 {
            break
        }
    }
    self.scrollView.contentInsetAdjustmentBehavior = .never
    self.tableView.contentInsetAdjustmentBehavior = .never
    self.tableView.contentInset = UIEdgeInsetsMake(contentInsetTop, 0, 0, 0)

}

how to do that would be adding new data and contents of the scroll data remained in place (in example telegram)

Has tried so, but is shifting not there

let offset = tableView.contentOffset    
tableView.reloadData()
tableView.layoutIfNeeded()
tableView.setContentOffset(offset, animated: false)
....
let indexPath = IndexPath(row: 2, section: tableView.numberOfSections - 1)
tableView.reloadData()
tableView.layoutIfNeeded()
tableView.scrollToRow(at: indexPath, at: .top, animated: false)

2

Answers


  1. Why you can try this?

      func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableTest.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = arrayTemp[indexPath.row]
    
        if indexPath.row > (arrayTemp.count / 2) {
            callNewData()
        }
        return cell
    }
    

    You can use a index loaded in table to add more values.

    when a cell is loaded you can call the function to add more data to table view, so if the data started with 10 values when a 5 cell is loaded you add more 10 itens in array temp so now the array have 20 values, when the table load a index 10 you call more itens.

    Login or Signup to reply.
  2. This extension method will help you maintain the position of visible cell. You can optimize it more by choosing the right index.

    extension UITableView {
        func reloadDataSavingPosition() {
            var rect: CGRect?
        
            if let index = indexPathsForVisibleRows?.first {
                rect = rectForRow(at: index)
            }
        
            reloadData()
    
            if let rect = rect {
                scrollRectToVisible(rect, animated: true)
            }
        }
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search