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
Why you can try this?
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.
This extension method will help you maintain the position of visible cell. You can optimize it more by choosing the right index.