Search code examples
swifttableviewcellreloaddata

UITableview Scrolls to Top on Reload


I am facing problem in my app - you can post and edit your favorite places. After posting a post, or editing a specific post (UITableViewCell), UITableview is reloaded.

My problem is: the UITableview scrolls to the top after reloading. But that's not what I want. I want my view to stay on the cell / view where I was. But I don't know how to manage that.

Could you help me?


Solution

  • Igor's answer is correct if you are using dynamically resizable cells (UITableViewAutomaticDimension)

    Here it is in swift 3:

        private var cellHeights: [IndexPath: CGFloat?] = [:]
        var expandedIndexPaths: [IndexPath] = []
    
        func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
            cellHeights[indexPath] = cell.frame.height
        }
    
        func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
            if let height = cellHeights[indexPath] {
                return height ?? UITableViewAutomaticDimension
            }
            return UITableViewAutomaticDimension
        }
    
    
        func expandCell(cell: UITableViewCell) {
          if let indexPath = tableView.indexPath(for: cell) {
            if !expandedIndexPaths.contains(indexPath) {
                expandedIndexPaths.append(indexPath)
                cellHeights[indexPath] = nil
                tableView.reloadRows(at: [indexPath], with: UITableViewRowAnimation.automatic)
                //tableView.scrollToRow(at: indexPath, at: .top, animated: true)
            }
          }
        }